Goツールが公開モジュールを見つける方法

Goの分散システムでは、モジュールを公開し、そのコードをリポジトリに残すことができます。Goツールは、モジュールの名前とバージョン番号を示すリポジトリパスとリポジトリタグを持つ命名規則に依存しています。リポジトリがこれらの要件に従っている場合、Goツールはリポジトリからモジュールコードをダウンロードできます。たとえば、go get コマンドです。

開発者がgo getコマンドを使用して、コードがインポートするパッケージのソースコードを取得する際、コマンドは次のように動作します:

  • 1. Goソースコード内のimportステートメントから、go getがパッケージパス内のモジュールパスを特定します。
  • 2. モジュールパスから派生したURLを使用して、コマンドはモジュールプロキシサーバーまたはリポジトリから直接モジュールソースを見つけます。
  • 3. モジュールのバージョン番号をリポジトリタグと照合して、リポジトリ内のコードを発見することで、ダウンロードするモジュールバージョンのソースを特定します。使用するバージョン番号がまだ不明な場合、go getは最新のリリースバージョンを特定します。
  • 4. モジュールソースを取得し、開発者のローカルモジュールキャッシュにダウンロードします。

リポジトリ内のコードの整理

ここで説明する慣習に従うことで、メンテナンスを簡素化し、開発者のモジュール体験を向上させることができます。モジュールコードをリポジトリに入れることは、一般的に他のコードと同様に簡単です。

以下の図は、2つのパッケージを持つシンプルなモジュールのソース階層を示しています。

モジュールソースコード階層を示す図

最初のコミットには、以下の表にリストされたファイルを含める必要があります:

ファイル 説明
LICENSE モジュールのライセンス。
go.mod モジュールを説明し、そのモジュールパス(実質的にはその名前)と依存関係を含みます。詳細については、
go.modリファレンスを参照してください。
モジュールパスは、次のようなモジュールディレクティブで指定されます:
{$pre0}

詳細なモジュールパスの選択については、
依存関係の管理を参照してください。
go.modファイルを編集することはできますが、goコマンドを通じて変更を行う方が信頼性が高いことがわかります。
go.sum モジュールの依存関係を表す暗号ハッシュを含みます。Goツールはこれらのハッシュを使用して、ダウンロードされたモジュールが本物であることを確認しようとします。この確認が失敗した場合、Goはセキュリティエラーを表示します。
依存関係がない場合、このファイルは空または存在しません。
このファイルは、go mod tidyコマンドを使用して不要なエントリを削除する以外は編集しないでください。
パッケージディレクトリと.goソース。 モジュール内のGoパッケージとソースを構成するディレクトリと.goファイル。

コマンドラインから、空のリポジトリを作成し、最初のコミットの一部となるファイルを追加し、メッセージと共にコミットできます。以下はgitを使用した例です:

  1. $ git init
  2. $ git add --all
  3. $ git commit -m "mycode: initial commit"
  4. $ git push

リポジトリのスコープの選択

コードが他のモジュールのコードとは独立してバージョン管理されるべき場合、モジュール内でコードを公開します。

リポジトリを設計して、そのルートディレクトリに単一のモジュールをホストするようにすると、特に新しいマイナーバージョンやパッチバージョンを公開し、新しいメジャーバージョンにブランチする際に、メンテナンスが簡素化されます。ただし、必要に応じて、単一のリポジトリ内でモジュールのコレクションを維持することもできます。

リポジトリごとに1つのモジュールをソースする

単一のモジュールのソースを持つリポジトリを維持できます。このモデルでは、リポジトリのルートにgo.modファイルを置き、その下にGoソースを含むパッケージのサブディレクトリを配置します。

これは最もシンプルなアプローチであり、モジュールの管理が時間とともに容易になる可能性があります。モジュールバージョン番号をディレクトリパスで接頭辞を付ける必要を回避するのに役立ちます。

リポジトリ内の単一モジュールのソースを示す図

単一のリポジトリで複数のモジュールをソースする

単一のリポジトリから複数のモジュールを公開できます。たとえば、単一のリポジトリに複数のモジュールを構成するコードがあるが、それらのモジュールを別々にバージョン管理したい場合があります。

モジュールのルートディレクトリである各サブディレクトリには、独自のgo.modファイルが必要です。

サブディレクトリでモジュールコードをソースすることは、モジュールを公開する際に使用するバージョンタグの形式を変更します。タグのバージョン番号部分をモジュールルートであるサブディレクトリの名前で接頭辞を付ける必要があります。バージョン番号の詳細については、モジュールバージョン番号付けを参照してください。

たとえば、以下のモジュールexample.com/mymodules/module1について、バージョンv1.2.3は次のようになります:

  • モジュールパス: example.com/mymodules/module1
  • バージョンタグ: module1/v1.2.3
  • ユーザーによってインポートされたパッケージパス: example.com/mymodules/module1/package1
  • ユーザーのrequireディレクティブに示されたモジュールパス: example.com/mymodules/module1 module1/v1.2.3

単一のリポジトリ内の2つのモジュールを示す図