Go Modules リファレンス
はじめに
モジュールは、Goが依存関係を管理する方法です。
このドキュメントは、Goのモジュールシステムに関する詳細なリファレンスマニュアルです。Goプロジェクトの作成に関する入門については、Goコードの書き方を参照してください。モジュールの使用方法、プロジェクトのモジュールへの移行、その他のトピックに関する情報については、Go Modulesの使用方法から始まるブログシリーズを参照してください。
モジュール、パッケージ、バージョン
モジュールは、一緒にリリース、バージョン管理、配布されるパッケージのコレクションです。モジュールは、バージョン管理リポジトリから直接、またはモジュールプロキシサーバーからダウンロードできます。
モジュールは、モジュールパスによって識別され、これはgo.mod
ファイルで宣言され、モジュールの依存関係に関する情報とともに提供されます。モジュールルートディレクトリは、go.mod
ファイルを含むディレクトリです。メインモジュールは、go
コマンドが呼び出されるディレクトリを含むモジュールです。
モジュール内の各パッケージは、同じディレクトリにあるソースファイルのコレクションであり、まとめてコンパイルされます。パッケージパスは、モジュールパスと、パッケージを含むサブディレクトリ(モジュールルートからの相対パス)を結合したものです。たとえば、モジュール"golang.org/x/net"
には、"html"
ディレクトリにパッケージが含まれています。そのパッケージのパスは"golang.org/x/net/html"
です。
モジュールパス
モジュールパスは、モジュールの標準名であり、モジュールのgo.mod
ファイルのmodule
ディレクティブで宣言されます。モジュールのパスは、モジュール内のパッケージパスのプレフィックスです。
モジュールパスは、モジュールの機能と場所の両方を記述する必要があります。通常、モジュールパスは、リポジトリのルートパス、リポジトリ内のディレクトリ(通常は空)、およびメジャーバージョンサフィックス(メジャーバージョン2以上の場合のみ)で構成されます。
- リポジトリルートパスは、モジュールが開発されているバージョン管理リポジトリのルートディレクトリに対応するモジュールパスの部分です。ほとんどのモジュールはリポジトリのルートディレクトリで定義されているため、これは通常、パス全体です。たとえば、
golang.org/x/net
は、同名のモジュールのリポジトリルートパスです。モジュールパスに対するリポジトリの検索で、go
コマンドがモジュールパスから派生したHTTPリクエストを使用してリポジトリをどのように見つけるかについての情報を確認してください。 - モジュールがリポジトリのルートディレクトリで定義されていない場合、モジュールサブディレクトリは、メジャーバージョンサフィックスを含まないディレクトリ名を指定するモジュールパスの部分です。これは、セマンティックバージョンのタグのプレフィックスとしても機能します。たとえば、モジュール
golang.org/x/tools/gopls
は、ルートパスgolang.org/x/tools
のリポジトリのgopls
サブディレクトリにあります。そのため、モジュールサブディレクトリはgopls
になります。バージョンとコミットのマッピングとリポジトリ内のモジュールディレクトリを参照してください。 - モジュールがメジャーバージョン2以上でリリースされている場合、モジュールパスはメジャーバージョンサフィックス(例:
/v2
)で終わる必要があります。これは、サブディレクトリ名の一部である場合とそうでない場合があります。たとえば、パスgolang.org/x/repo/sub/v2
のモジュールは、リポジトリgolang.org/x/repo
の/sub
または/sub/v2
サブディレクトリにある可能性があります。
他のモジュールによって依存される可能性のあるモジュールの場合、これらの規則に従う必要があります。これにより、go
コマンドはモジュールを見つけ、ダウンロードできます。また、モジュールパスで使用できる文字に関するいくつかの字句上の制限もあります。
他のモジュールの依存関係として取得されることがないモジュールは、有効なパッケージパスをモジュールパスとして使用できますが、モジュールの依存関係またはGo標準ライブラリで使用される可能性のあるパスと競合しないように注意する必要があります。Go標準ライブラリは、最初のパス要素にドットを含まないパッケージパスを使用し、go
コマンドはネットワークサーバーからそのようなパスを解決しようとしません。パスexample
とtest
はユーザー用に予約されています。これらは標準ライブラリでは使用されず、チュートリアルやサンプルコードで定義されているモジュール、またはテストの一部として作成および操作されるモジュールなど、自己完結型のモジュールで使用できます。
バージョン
バージョンは、モジュールの不変のスナップショットを識別し、リリースまたはプレリリースのいずれかになります。各バージョンは文字v
で始まり、その後にセマンティックバージョンが続きます。バージョンがどのようにフォーマットされ、解釈され、比較されるかについての詳細は、Semantic Versioning 2.0.0を参照してください。
要約すると、セマンティックバージョンは、3つの非負の整数(メジャーバージョン、マイナーバージョン、パッチバージョン、左から右)で構成され、ドットで区切られています。パッチバージョンには、ハイフンで始まるオプションのプレリリース文字列が続く場合があります。プレリリース文字列またはパッチバージョンには、プラスで始まるビルドメタデータ文字列が続く場合があります。たとえば、v0.0.0
、v1.12.134
、v8.0.5-pre
、v2.0.9+meta
は有効なバージョンです。
バージョンの各部分は、バージョンが安定しているかどうか、以前のバージョンと互換性があるかどうかを示します。
- メジャーバージョンは、モジュールの公開インターフェースまたは文書化された機能に後方互換性のない変更が行われた後(たとえば、パッケージが削除された後)、インクリメントする必要があり、マイナーバージョンとパッチバージョンは0に設定する必要があります。
- マイナーバージョンは、後方互換性のある変更が行われた後(たとえば、新しい関数が追加された後)、インクリメントする必要があり、パッチバージョンは0に設定する必要があります。
- パッチバージョンは、モジュールの公開インターフェースに影響を与えない変更(バグ修正や最適化など)の後、インクリメントする必要があります。
- プレリリースサフィックスは、バージョンがプレリリースであることを示します。プレリリースバージョンは、対応するリリースバージョンよりも前にソートされます。たとえば、
v1.2.3-pre
はv1.2.3
の前に来ます。 - ビルドメタデータサフィックスは、バージョンの比較のために無視されます。goコマンドはビルドメタデータを含むバージョンを受け入れ、それらを擬似バージョンに変換して、バージョン間の合計順序を維持します。特別なサフィックス
+incompatible
は、モジュールバージョンメジャーバージョン2以降に移行する前にリリースされたバージョンを示します(非モジュールリポジトリとの互換性を参照)。
メジャーバージョンが0であるか、プレリリースサフィックスがある場合、バージョンは不安定と見なされます。不安定なバージョンは、互換性要件の対象ではありません。たとえば、v0.2.0
はv0.1.0
と互換性がない可能性があり、v1.5.0-beta
はv1.5.0
と互換性がない可能性があります。
Goは、これらの規則に従わないタグ、ブランチ、またはリビジョンを使用して、バージョン管理システム内のモジュールにアクセスできます。ただし、メインモジュール内では、go
コマンドは、この標準に従わないリビジョン名を自動的に標準的なバージョンに変換します。go
コマンドは、このプロセスの一部としてビルドメタデータサフィックス(+incompatible
を除く)も削除します。これにより、擬似バージョン、つまりリビジョン識別子(Gitコミットハッシュなど)とバージョン管理システムからのタイムスタンプをエンコードしたプレリリースバージョンが生成される可能性があります。たとえば、コマンドgo get golang.org/x/net@daa7c041
は、コミットハッシュdaa7c041
を擬似バージョンv0.0.0-20191109021931-daa7c04131f5
に変換します。標準バージョンの使用はメインモジュール以外でも必要であり、go
コマンドは、master
のような標準ではないバージョンがgo.mod
ファイルに存在する場合、エラーを報告します。
擬似バージョン
擬似バージョンは、バージョン管理リポジトリの特定のリビジョンに関する情報をエンコードした、特別にフォーマットされたプレリリースバージョンです。たとえば、v0.0.0-20191109021931-daa7c04131f5
は擬似バージョンです。
擬似バージョンは、セマンティックバージョンのタグが利用できないリビジョンを参照する場合があります。たとえば、開発ブランチでバージョンタグを作成する前に、コミットをテストするために使用できます。
各擬似バージョンには3つの部分があります。
- ベースバージョンプレフィックス(
vX.0.0
またはvX.Y.Z-0
)。これは、リビジョンの前にあるセマンティックバージョンのタグから派生するか、そのようなタグがない場合はvX.0.0
です。 - タイムスタンプ(
yyyymmddhhmmss
)。これは、リビジョンが作成されたUTC時間です。Gitでは、これはコミット時間であり、作成者時間ではありません。 - リビジョン識別子(
abcdefabcdef
)。これは、コミットハッシュの12文字のプレフィックスです。Subversionでは、ゼロ埋めされたリビジョン番号です。
各擬似バージョンは、ベースバージョンに応じて3つの形式のいずれかになります。これらの形式により、擬似バージョンはベースバージョンよりも高く、次のタグ付きバージョンよりも低く比較されます。
vX.0.0-yyyymmddhhmmss-abcdefabcdef
は、既知のベースバージョンがない場合に使用されます。すべてのバージョンと同様に、メジャーバージョンX
はモジュールのメジャーバージョンサフィックスと一致する必要があります。vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
は、ベースバージョンがvX.Y.Z-pre
のようなプレリリースバージョンである場合に使用されます。vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef
は、ベースバージョンがvX.Y.Z
のようなリリースバージョンである場合に使用されます。たとえば、ベースバージョンがv1.2.3
の場合、擬似バージョンはv1.2.4-0.20191109021931-daa7c04131f5
になる可能性があります。
複数の擬似バージョンが、異なるベースバージョンを使用して同じコミットを参照する場合があります。これは、下位のバージョンが擬似バージョンが記述された後にタグ付けされるときに自然に発生します。
これらの形式により、擬似バージョンには2つの便利な特性が与えられます。
- 既知のベースバージョンを持つ擬似バージョンは、それらのバージョンよりも高く、それ以降のバージョンの他のプレリリースよりも低くソートされます。
- 同じベースバージョンプレフィックスを持つ擬似バージョンは、時系列順にソートされます。
go
コマンドは、モジュール作成者が擬似バージョンを他のバージョンとどのように比較するかを制御し、擬似バージョンが実際にモジュールのコミット履歴の一部であるリビジョンを参照するようにするためのいくつかのチェックを実行します。
- ベースバージョンが指定されている場合、擬似バージョンで記述されているリビジョンの祖先である対応するセマンティックバージョンのタグが存在する必要があります。これにより、開発者は、
v1.999.999-99999999999999-daa7c04131f5
のような、すべてのタグ付きバージョンよりも高く比較される擬似バージョンを使用して、最小バージョンの選択を回避することが防止されます。 - タイムスタンプは、リビジョンのタイムスタンプと一致する必要があります。これにより、攻撃者がモジュールプロキシを無制限の数のそれ以外の点で同一の擬似バージョンでフラッドすることを防止します。これにより、モジュールコンシューマーがバージョンの相対的な順序を変更することも防止されます。
- リビジョンは、モジュールリポジトリのブランチまたはタグのいずれかの祖先である必要があります。これにより、攻撃者が承認されていない変更やプルリクエストを参照することを防ぎます。
擬似バージョンを手動で入力する必要はありません。多くのコマンドはコミットハッシュまたはブランチ名を受け入れ、それを擬似バージョン(または利用可能な場合はタグ付きバージョン)に自動的に変換します。例えば
go get example.com/mod@master
go list -m -json example.com/mod@abcd1234
メジャーバージョン接尾辞
メジャーバージョン2以降、モジュールパスには、メジャーバージョンと一致する/v2
のようなメジャーバージョン接尾辞が必要です。例えば、モジュールがバージョンv1.0.0
でパスexample.com/mod
を持つ場合、バージョンv2.0.0
ではパスexample.com/mod/v2
を持つ必要があります。
メジャーバージョン接尾辞は、インポート互換性ルールを実装します。
古いパッケージと新しいパッケージが同じインポートパスを持つ場合、新しいパッケージは古いパッケージと後方互換性がある必要があります。
定義上、モジュールの新しいメジャーバージョンにあるパッケージは、前のメジャーバージョンにある対応するパッケージと後方互換性はありません。その結果、v2
以降のパッケージには新しいインポートパスが必要です。これは、モジュールパスにメジャーバージョン接尾辞を追加することで実現されます。モジュールパスはモジュール内の各パッケージのインポートパスのプレフィックスであるため、モジュールパスにメジャーバージョン接尾辞を追加することで、各非互換バージョンに対して個別のインポートパスが提供されます。
メジャーバージョン接尾辞は、メジャーバージョンv0
またはv1
では許可されません。v0
バージョンは不安定であり、互換性の保証がないため、v0
とv1
の間でモジュールパスを変更する必要はありません。さらに、ほとんどのモジュールでは、v1
は最後のv0
バージョンと後方互換性があります。v1
バージョンは、v0
と比較した非互換な変更を示すのではなく、互換性へのコミットメントとして機能します。
特別なケースとして、gopkg.in/
で始まるモジュールパスは、v0
およびv1
でも常にメジャーバージョン接尾辞が必要です。接尾辞はスラッシュではなくドットで始める必要があります(例:gopkg.in/yaml.v2
)。
メジャーバージョン接尾辞により、同じビルドでモジュールの複数のメジャーバージョンを共存させることができます。これは、ダイヤモンド依存関係の問題のために必要になる場合があります。通常、モジュールが推移的依存関係によって2つの異なるバージョンで必要とされる場合、より高いバージョンが使用されます。しかし、2つのバージョンが非互換である場合、どちらのバージョンもすべてのクライアントを満たすことはできません。非互換バージョンは異なるメジャーバージョン番号を持つ必要があるため、メジャーバージョン接尾辞のために異なるモジュールパスも持つ必要があります。これにより、競合が解決されます。異なる接尾辞を持つモジュールは個別のモジュールとして扱われ、それらのパッケージ(モジュールルートに対する同じサブディレクトリにあるパッケージも含む)は個別のものになります。
多くのGoプロジェクトは、モジュールに移行する前(モジュールが導入される前かもしれません)に、メジャーバージョン接尾辞を使用せずにv2
以降でバージョンをリリースしていました。これらのバージョンには、+incompatible
ビルドタグ(例:v2.0.0+incompatible
)が付加されています。詳細については、非モジュールリポジトリとの互換性を参照してください。
パッケージをモジュールに解決する
go
コマンドがパッケージパスを使用してパッケージをロードする場合、パッケージを提供するモジュールを決定する必要があります。
go
コマンドは、パッケージパスのプレフィックスであるパスを持つモジュールについて、ビルドリストを最初に検索します。例えば、パッケージexample.com/a/b
がインポートされ、モジュールexample.com/a
がビルドリストにある場合、go
コマンドは、example.com/a
がディレクトリb
にパッケージを含んでいるかどうかをチェックします。ディレクトリには、少なくとも.go
拡張子のファイルが1つ存在する必要があります。この目的では、ビルド制約は適用されません。ビルドリスト内のモジュールがパッケージを正確に1つ提供する場合、そのモジュールが使用されます。パッケージを提供するモジュールがない場合、または2つ以上のモジュールがパッケージを提供する場合、go
コマンドはエラーを報告します。-mod=mod
フラグは、go
コマンドに、不足しているパッケージを提供する新しいモジュールを見つけること、およびgo.mod
とgo.sum
を更新することを指示します。go get
コマンドとgo mod tidy
コマンドはこれを自動的に実行します。
go
コマンドがパッケージパスに対して新しいモジュールを検索する場合、プロキシURLのコンマ区切りリスト、またはキーワードdirect
またはoff
であるGOPROXY
環境変数をチェックします。プロキシURLは、go
コマンドがGOPROXY
プロトコルを使用してモジュールプロキシに連絡する必要があることを示します。direct
は、go
コマンドがバージョン管理システムと通信する必要があることを示します。off
は、通信を試行しないことを示します。GOPRIVATE
およびGONOPROXY
環境変数を使用して、この動作を制御することもできます。
GOPROXY
リストの各エントリについて、go
コマンドは、パッケージを提供する可能性のある各モジュールパスの最新バージョン(つまり、パッケージパスの各プレフィックス)を要求します。正常に要求されたモジュールパスごとに、go
コマンドは最新バージョンのモジュールをダウンロードし、モジュールが要求されたパッケージを含んでいるかどうかをチェックします。1つ以上のモジュールが要求されたパッケージを含む場合、パスが最も長いモジュールが使用されます。1つ以上のモジュールが見つかったが、要求されたパッケージを含んでいないモジュールがない場合、エラーが報告されます。モジュールが見つからない場合、go
コマンドはGOPROXY
リストの次のエントリを試行します。エントリが残っていない場合、エラーが報告されます。
例えば、go
コマンドがパッケージgolang.org/x/net/html
を提供するモジュールを探しており、GOPROXY
がhttps://corp.example.com,https://proxy.golang.org
に設定されているとします。go
コマンドは以下のリクエストを行う可能性があります。
https://corp.example.com/
へ(並列で)golang.org/x/net/html
の最新バージョンのリクエストgolang.org/x/net
の最新バージョンのリクエストgolang.org/x
の最新バージョンのリクエストgolang.org
の最新バージョンのリクエスト
https://corp.example.com/
へのすべてのリクエストが404または410で失敗した場合、https://proxy.golang.org/
へgolang.org/x/net/html
の最新バージョンのリクエストgolang.org/x/net
の最新バージョンのリクエストgolang.org/x
の最新バージョンのリクエストgolang.org
の最新バージョンのリクエスト
適切なモジュールが見つかった後、go
コマンドは、新しいモジュールのパスとバージョンを含む新しい要件をメインモジュールのgo.mod
ファイルに追加します。これにより、将来同じパッケージがロードされた場合、同じモジュールが同じバージョンで使用されるようになります。解決されたパッケージがメインモジュールのいかなるパッケージによってもインポートされていない場合、新しい要件には// indirect
コメントが付きます。
go.mod
ファイル
モジュールは、ルートディレクトリにあるgo.mod
という名前のUTF-8エンコードテキストファイルによって定義されます。go.mod
ファイルは、行指向です。各行は、キーワードとそれに続く引数で構成される単一のディレクティブを保持します。例えば
module example.com/my/thing
go 1.12
require example.com/other/thing v1.0.2
require example.com/new/thing/v2 v2.3.4
exclude example.com/old/thing v1.2.3
replace example.com/bad/thing v1.4.5 => example.com/good/thing v1.4.5
retract [v1.9.0, v1.9.5]
先頭のキーワードは、隣接する行から要因化して、Goのインポートのようにブロックを作成できます。
require (
example.com/new/thing/v2 v2.3.4
example.com/old/thing v1.2.3
)
go.mod
ファイルは、人間が読みやすく、機械が書き込み可能になるように設計されています。go
コマンドは、go.mod
ファイルを変更するいくつかのサブコマンドを提供します。例えば、go get
は、特定の依存関係をアップグレードまたはダウングレードできます。モジュールグラフをロードするコマンドは、必要に応じて自動的にgo.mod
を更新します。go mod edit
は、低レベルの編集を実行できます。golang.org/x/mod/modfile
パッケージは、Goプログラムがプログラムで同じ変更を行うために使用できます。
メインモジュールと、ローカルファイルパスで指定された置換モジュールには、go.mod
ファイルが必要です。しかし、明示的なgo.mod
ファイルがないモジュールでも、依存関係として必要とされる可能性があり、モジュールパスとバージョンで指定された置換として使用される可能性があります。非モジュールリポジトリとの互換性を参照してください。
字句要素
go.mod
ファイルが解析されると、その内容はトークンのシーケンスに分割されます。いくつかの種類のトークンがあります。空白、コメント、句読点、キーワード、識別子、文字列です。
空白は、スペース(U+0020)、タブ(U+0009)、キャリッジリターン(U+000D)、改行(U+000A)で構成されます。改行以外の空白文字は、それ以外の場合に結合されるトークンを分離すること以外には効果がありません。改行は重要なトークンです。
コメントは//
で始まり、行末まで続きます。/* */
コメントは許可されていません。
句読点トークンには、(
、)
、=>
が含まれます。
キーワードは、go.mod
ファイル内のさまざまな種類のディレクティブを区別します。許可されるキーワードは、module
、go
、require
、replace
、exclude
、retract
です。
識別子は、モジュールパスやセマンティックバージョンなどの空白以外の文字のシーケンスです。
文字列は、引用符で囲まれた文字のシーケンスです。2種類の文字列があります。引用符("
、U+0022)で始まり、引用符で終わる解釈された文字列と、アクセント記号(`
、U+0060)で始まり、アクセント記号で終わる生の文字列です。解釈された文字列には、バックスラッシュ(\
、U+005C)の後に別の文字が続くエスケープシーケンスを含めることができます。エスケープされた引用符(\"
)は、解釈された文字列を終了しません。解釈された文字列の引用符なしの値は、引用符の間の文字のシーケンスであり、各エスケープシーケンスはバックスラッシュの後の文字に置き換えられます(例:\"
は"
に置き換えられ、\n
はn
に置き換えられます)。これとは対照的に、生の文字列の引用符なしの値は、単にアクセント記号の間の文字のシーケンスです。バックスラッシュは生の文字列内では特別な意味を持ちません。
識別子と文字列は、go.mod
文法では互換性があります。
モジュールパスとバージョン
go.mod
ファイルのほとんどの識別子と文字列は、モジュールパスまたはバージョンです。
モジュールパスは、次の要件を満たす必要があります。
- パスは、スラッシュ(
/
、U+002F)で区切られた1つ以上のパス要素で構成されている必要があります。スラッシュで始まることも終わることもできません。 - 各パス要素は、ASCII文字、ASCII数字、および制限されたASCII句読点(
-
、.
、_
、~
)で構成される空ではない文字列です。 - パス要素は、ドット(
.
、U+002E)で始まることも終わることもできません。 - 最初のドットまでの要素プレフィックスは、大文字小文字を問わず、Windowsのリザーブされたファイル名(
CON
、com1
、NuL
など)であってはなりません。 - 最初のドットまでの要素プレフィックスは、チルダの後に1つ以上の数字が続くもので終わってはなりません(
EXAMPL~1.COM
など)。
モジュールパスがrequire
ディレクティブに表示され、置換されていない場合、またはモジュールパスがreplace
ディレクティブの右側にある場合、go
コマンドは、そのパスを持つモジュールをダウンロードする必要がある可能性があり、さらにいくつかの要件を満たす必要があります。
- 先頭のパス要素(最初のスラッシュまで、ある場合)、慣例によりドメイン名は、小文字のASCII文字、ASCII数字、ドット(
.
、U+002E)、およびダッシュ(-
、U+002D)のみを含める必要があります。少なくとも1つのドットを含める必要があり、ダッシュで始めることはできません。 /vN
形式の最終パス要素の場合、N
は数値のように見えます(ASCII数字とドット)、N
は先頭に0を付けることはできず、/v1
であってはならず、ドットを含んではなりません。gopkg.in/
で始まるパスについては、この要件は、パスがgopkg.inサービスの規約に従うという要件に置き換えられます。
go.mod
ファイルのバージョンは、正規のバージョンまたは正規でないバージョンです。
標準バージョンは、v
という文字で始まり、Semantic Versioning 2.0.0仕様に従ったセマンティックバージョンが続きます。バージョンに関する詳細については、そちらを参照してください。
ファイルシステム、リポジトリ、モジュールプロキシの問題を避けるためのいくつかの制限はありますが、ほとんどの他の識別子と文字列は標準以外のバージョンとして使用できます。標準以外のバージョンは、メインモジュールのgo.mod
ファイルでのみ許可されます。go
コマンドは、go.mod
ファイルを自動的に更新する際に、標準以外のバージョンを同等の標準バージョンに置き換えることを試みます。
モジュールパスがバージョンに関連付けられている場所(require
、replace
、exclude
ディレクティブなど)、最終パス要素はバージョンと一致する必要があります。メジャーバージョンサフィックスを参照してください。
文法
go.mod
構文は、拡張バッカス・ナウア記法(EBNF)を使用して以下に指定されています。EBNF構文の詳細については、Go言語仕様の表記セクションを参照してください。
GoMod = { Directive } .
Directive = ModuleDirective |
GoDirective |
RequireDirective |
ExcludeDirective |
ReplaceDirective |
RetractDirective .
改行、識別子、文字列は、それぞれnewline
、ident
、string
で示されます。
モジュールパスとバージョンは、ModulePath
とVersion
で示されます。
ModulePath = ident | string . /* see restrictions above */
Version = ident | string . /* see restrictions above */
module
ディレクティブ
module
ディレクティブは、メインモジュールのパスを定義します。go.mod
ファイルには、正確に1つのmodule
ディレクティブが含まれている必要があります。
ModuleDirective = "module" ( ModulePath | "(" newline ModulePath newline ")" ) newline .
例
module golang.org/x/net
非推奨化
モジュールは、段落の先頭に文字列Deprecated:
(大文字と小文字が区別される)を含むコメントブロックで非推奨としてマークできます。非推奨メッセージは大文字と小文字を区別してコロンの後に始まり、段落の最後まで続きます。コメントは、module
ディレクティブの直前に、または同じ行の後に出現する可能性があります。
例
// Deprecated: use example.com/mod/v2 instead.
module example.com/mod
Go 1.17以降、go list -m -u
はビルドリスト内のすべての非推奨モジュールに関する情報をチェックします。go get
は、コマンドラインで指定されたパッケージをビルドするために必要な非推奨モジュールをチェックします。
go
コマンドがモジュールの非推奨情報を取得すると、バージョン照会の@latest
に一致するバージョンからgo.mod
ファイルを読み込みます。リトラクトや除外は考慮されません。go
コマンドは、同じgo.mod
ファイルからリトラクトされたバージョンのリストを読み込みます。
モジュールを非推奨にするには、作成者は// Deprecated:
コメントを追加し、新しいリリースにタグを付けます。作成者は、上位のリリースで非推奨メッセージを変更または削除できます。
非推奨化は、モジュールのすべてのマイナーバージョンに適用されます。v2
より大きいメジャーバージョンは、メジャーバージョンサフィックスによって異なるモジュールパスが与えられるため、この目的では個別のモジュールと見なされます。
非推奨メッセージは、モジュールがもうサポートされていないことをユーザーに知らせ、最新のメジャーバージョンなどへの移行手順を提供することを目的としています。個々のマイナーバージョンとパッチバージョンは非推奨にすることはできません。retract
の方が適切な場合があります。
go
ディレクティブ
go
ディレクティブは、特定のバージョンのGoのセマンティクスを想定してモジュールが記述されたことを示します。バージョンは、1.9
、1.14
、1.21rc1
など、有効なGoバージョンである必要があります。
go
ディレクティブは、このモジュールを使用するために必要なGoの最小バージョンを設定します。Go 1.21より前は、ディレクティブは助言のみでしたが、現在は必須要件です。Goツールチェーンは、新しいGoバージョンを宣言するモジュールを使用することを拒否します。
go
ディレクティブは、実行するGoツールチェーンの選択への入力となります。詳細は「Goツールチェーン」を参照してください。
go
ディレクティブは、新しい言語機能の使用に影響します
- モジュール内のパッケージについて、コンパイラは、
go
ディレクティブで指定されたバージョン以降に導入された言語機能の使用を拒否します。たとえば、モジュールにgo 1.12
ディレクティブがある場合、そのパッケージは、Go 1.13で導入された1_000_000
のような数値リテラルを使用できません。 - 古いGoバージョンがモジュールのいずれかのパッケージをビルドし、コンパイルエラーが発生した場合、エラーはモジュールが新しいGoバージョン用に記述されていることを示します。たとえば、モジュールに
go 1.13
があり、パッケージが数値リテラル1_000_000
を使用しているとします。そのパッケージがGo 1.12でビルドされると、コンパイラはコードがGo 1.13用に記述されていることを示します。
go
ディレクティブは、go
コマンドの動作にも影響します
go 1.14
以降、自動ベンダー化を有効にできます。ファイルvendor/modules.txt
が存在し、go.mod
と一致する場合は、-mod=vendor
フラグを明示的に使用する必要はありません。go 1.16
以降、all
パッケージパターンは、メインモジュールのパッケージとテストによって推移的にインポートされたパッケージのみに一致します。これは、モジュールが導入されて以来、go mod vendor
によって保持されているパッケージのセットと同じです。以前のバージョンでは、all
には、メインモジュールのパッケージによってインポートされたパッケージのテスト、それらのパッケージのテストなどが含まれていました。go 1.17
以降go.mod
ファイルには、メインモジュールのパッケージまたはテストによって推移的にインポートされたパッケージを提供する各モジュールに対する明示的なrequire
ディレクティブが含まれています。(go 1.16
以前は、最小バージョン選択によって異なるバージョンが選択されない限り、間接依存関係は含まれていませんでした。)この追加情報は、モジュールグラフの削減と遅延モジュール読み込みを可能にします。- 以前の
go
バージョンよりも多くの// indirect
依存関係が存在する可能性があるため、間接依存関係はgo.mod
ファイル内の別のブロックに記録されます。 go mod vendor
は、ベンダー化された依存関係のgo.mod
ファイルとgo.sum
ファイルを省略します。(これにより、vendor
のサブディレクトリ内でのgo
コマンドの呼び出しで、正しいメインモジュールを識別できます。)go mod vendor
は、各依存関係のgo.mod
ファイルからのgo
バージョンをvendor/modules.txt
に記録します。
go 1.21
以降go
行は、このモジュールで使用するために必要なGoの最小バージョンを宣言します。go
行は、すべての依存関係のgo
行以上である必要があります。go
コマンドは、以前の古いバージョンのGoとの互換性を維持しようとすることがなくなりました。go
コマンドは、go.sum
ファイル内のgo.mod
ファイルのチェックサムをより慎重に保持するようになりました。
go.mod
ファイルには、最大で1つのgo
ディレクティブを含めることができます。ほとんどのコマンドは、存在しない場合は現在のGoバージョンでgo
ディレクティブを追加します。
go
ディレクティブが存在しない場合、go 1.16
が想定されます。
GoDirective = "go" GoVersion newline .
GoVersion = string | ident . /* valid release version; see above */
例
go 1.14
toolchain
ディレクティブ
toolchain
ディレクティブは、モジュールで使用することを推奨するGoツールチェーンを宣言します。推奨されるGoツールチェーンのバージョンは、go
ディレクティブで宣言された必須Goバージョンより小さいことはできません。toolchain
ディレクティブは、モジュールがメインモジュールであり、デフォルトのツールチェーンのバージョンが推奨されるツールチェーンのバージョンより小さい場合にのみ効果があります。
再現性を確保するために、go
コマンドは、go.mod
ファイルのgo
バージョンを更新するたびに(通常はgo get
中に)、独自のツールチェーン名をtoolchain
行に書き込みます。
詳細については、「Goツールチェーン」を参照してください。
ToolchainDirective = "toolchain" ToolchainName newline .
ToolchainName = string | ident . /* valid toolchain name; see “Go toolchains” */
例
toolchain go1.21.0
godebug
ディレクティブ
godebug
ディレクティブは、このモジュールがメインモジュールである場合に適用する単一のGODEBUG設定を宣言します。このような行は複数存在でき、それらはファクタリングできます。メインモジュールが存在しないGODEBUGキーを指定することはエラーです。godebug key=value
の効果は、コンパイルされているすべてのメインパッケージに、//go:debug key=value
をリストしたソースファイルが含まれている場合と同じです。
GodebugDirective = "godebug" ( GodebugSpec | "(" newline { GodebugSpec } ")" newline ) .
GodebugSpec = GodebugKey "=" GodebugValue newline.
GodebugKey = GodebugChar { GodebugChar }.
GodebugValue = GodebugChar { GodebugChar }.
GodebugChar = any non-space character except , " ` ' (comma and quotes).
例
godebug default=go1.21
godebug (
panicnil=1
asynctimerchan=0
)
require
ディレクティブ
require
ディレクティブは、指定されたモジュール依存関係の最小必要なバージョンを宣言します。必要なモジュールバージョンごとに、go
コマンドはそのバージョンのgo.mod
ファイルを読み込み、そのファイルからの要件を組み込みます。すべての要件が読み込まれると、go
コマンドは最小バージョン選択(MVS)を使用してそれらを解決し、ビルドリストを生成します。
go
コマンドは、一部の要件に対して// indirect
コメントを自動的に追加します。// indirect
コメントは、必要なモジュールのパッケージがメインモジュールのどのパッケージによっても直接インポートされていないことを示します。
go
ディレクティブがgo 1.16
以下を指定している場合、go
コマンドは、モジュールの選択されたバージョンがメインモジュールの他の依存関係によって既に暗示されているもの(推移的に)よりも高い場合に、間接的な要件を追加します。これは、明示的なアップグレード(go get -u ./...
)、以前は要件を課していた他の依存関係の削除(go mod tidy
)、または対応する要件が独自のgo.mod
ファイルにないパッケージをインポートする依存関係(go.mod
ファイルがまったくない依存関係など)のために発生する可能性があります。
go 1.17
以降では、go
コマンドは、メインモジュールのパッケージまたはテストによって(間接的にでも)インポートされたパッケージ、またはgo get
に渡された引数によってインポートされたパッケージを提供する各モジュールに対して、間接的な要件を追加します。これらのより包括的な要件により、モジュールグラフの削減と遅延モジュール読み込みが可能になります。
RequireDirective = "require" ( RequireSpec | "(" newline { RequireSpec } ")" newline ) .
RequireSpec = ModulePath Version newline .
例
require golang.org/x/net v1.2.3
require (
golang.org/x/crypto v1.4.5 // indirect
golang.org/x/text v1.6.7
)
exclude
ディレクティブ
exclude
ディレクティブは、go
コマンドによってモジュールバージョンが読み込まれるのを防ぎます。
Go 1.16以降、任意のgo.mod
ファイルのrequire
ディレクティブによって参照されるバージョンが、メインモジュールのgo.mod
ファイルのexclude
ディレクティブによって除外されている場合、その要件は無視されます。これにより、go get
やgo mod tidy
などのコマンドが、必要に応じて// indirect
コメント付きで、より高いバージョンの新しい要件をgo.mod
に追加する可能性があります。
Go 1.16以前は、除外されたバージョンがrequire
ディレクティブによって参照されている場合、go
コマンドはモジュールの使用可能なバージョンをリストし(go list -m -versions
で表示されるように)、代わりに次の高い除外されていないバージョンを読み込みました。次の高いバージョンは時間の経過とともに変化する可能性があるため、これは非決定的なバージョン選択につながる可能性があります。この目的では、リリースバージョンとプレリリースバージョンの両方が考慮されましたが、擬似バージョンは考慮されませんでした。上位バージョンがない場合、go
コマンドはエラーを報告しました。
exclude
ディレクティブは、メインモジュールのgo.mod
ファイルでのみ適用され、他のモジュールでは無視されます。詳細については、最小バージョン選択を参照してください。
ExcludeDirective = "exclude" ( ExcludeSpec | "(" newline { ExcludeSpec } ")" newline ) .
ExcludeSpec = ModulePath Version newline .
例
exclude golang.org/x/net v1.2.3
exclude (
golang.org/x/crypto v1.4.5
golang.org/x/text v1.6.7
)
replace
ディレクティブ
replace
ディレクティブは、モジュールの特定のバージョン、またはモジュールのすべてのバージョンの内容を、他の場所にある内容で置き換えます。置換先は、別のモジュールパスとバージョン、またはプラットフォーム固有のファイルパスで指定できます。
矢印 (=>
) の左側バージョンが指定されている場合、モジュールのその特定のバージョンのみが置き換えられ、他のバージョンは通常どおりアクセスされます。左側のバージョンが省略されている場合、モジュールのすべてのバージョンが置き換えられます。
矢印の右側のパスが絶対パスまたは相対パス (./
または ../
で始まる) の場合、置換モジュールのルートディレクトリへのローカルファイルパスとして解釈されます。このディレクトリには、go.mod
ファイルが含まれている必要があります。この場合、置換バージョンは省略する必要があります。
矢印の右側のパスがローカルパスでない場合、有効なモジュールパスである必要があります。この場合、バージョンが必要です。同じモジュールバージョンがビルドリストにも含まれていてはいけません。
ローカルパスまたはモジュールパスで置換が指定されているかに関わらず、置換モジュールにgo.mod
ファイルがある場合、そのmodule
ディレクティブは、置き換えられるモジュールパスと一致する必要があります。
replace
ディレクティブは、メインモジュールの go.mod
ファイルでのみ適用され、他のモジュールでは無視されます。詳細は最小バージョン選択を参照してください。
複数のメインモジュールがある場合、すべてのメインモジュールの go.mod
ファイルが適用されます。メインモジュール間での replace
ディレクティブの競合は許可されず、削除するか、go.work
ファイルの replace で上書きする必要があります。
replace
ディレクティブだけでは、モジュールグラフにモジュールが追加されるわけではないことに注意してください。置換されたモジュールバージョンを参照するrequire
ディレクティブも必要です。これは、メインモジュールの go.mod
ファイルまたは依存関係の go.mod
ファイルのいずれかに存在する必要があります。左側のモジュールバージョンが要求されていない場合、replace
ディレクティブは効果がありません。
ReplaceDirective = "replace" ( ReplaceSpec | "(" newline { ReplaceSpec } ")" newline ) .
ReplaceSpec = ModulePath [ Version ] "=>" FilePath newline
| ModulePath [ Version ] "=>" ModulePath Version newline .
FilePath = /* platform-specific relative or absolute file path */
例
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
replace (
golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
golang.org/x/net => example.com/fork/net v1.4.5
golang.org/x/net v1.2.3 => ./fork/net
golang.org/x/net => ./fork/net
)
retract
ディレクティブ
retract
ディレクティブは、go.mod
で定義されたモジュールのバージョンまたはバージョンの範囲が依存すべきではないことを示します。retract
ディレクティブは、バージョンが時期尚早に公開された場合、またはバージョンが公開された後に重大な問題が発見された場合に役立ちます。取り消されたバージョンは、バージョン管理リポジトリおよびモジュールプロキシで引き続き利用可能にする必要があります。これにより、それらに依存するビルドが中断されないようにします。「retract」という単語は、学術文献から借用したものです。取り消された研究論文は依然として入手可能ですが、問題があり、今後の作業の基礎としては使用すべきではありません。
モジュールバージョンが取り消された場合、ユーザーはgo get
、go mod tidy
、またはその他のコマンドを使用して自動的にアップグレードされません。取り消されたバージョンに依存するビルドは引き続き機能しますが、ユーザーはgo list -m -u
で更新を確認するか、go get
で関連モジュールを更新すると、取り消しについて通知されます。
バージョンを取り消すには、モジュール作成者は go.mod
に retract
ディレクティブを追加してから、そのディレクティブを含む新しいバージョンを公開する必要があります。新しいバージョンは、他のリリースバージョンまたはプレリリースバージョンよりも高いバージョンである必要があります。つまり、@latest
バージョン照会 は、取り消しが考慮される前に新しいバージョンを解決する必要があります。go
コマンドは、go list -m -retracted $modpath@latest
(ここで $modpath
はモジュールパス) で表示されるバージョンから取り消しを読み込んで適用します。
取り消されたバージョンは、-retracted
フラグを使用しない限り、go list -m -versions
で出力されるバージョンリストには表示されません。取り消されたバージョンは、@>=v1.2.3
や @latest
のようなバージョン照会を解決する際には除外されます。
取り消しを含むバージョンは、それ自体を取り消すことができます。モジュールの最新のリリースバージョンまたはプレリリースバージョンがそれ自体を取り消す場合、取り消されたバージョンを除外した後、@latest
クエリはより低いバージョンを解決します。
例として、モジュール example.com/m
の作成者が誤ってバージョン v1.0.0
を公開した場合を考えます。ユーザーが v1.0.0
にアップグレードするのを防ぐために、作成者は go.mod
に 2 つの retract
ディレクティブを追加してから、取り消しを含む v1.0.1
をタグ付けできます。
retract (
v1.0.0 // Published accidentally.
v1.0.1 // Contains retractions only.
)
ユーザーが go get example.com/m@latest
を実行すると、go
コマンドは v1.0.1
から取り消しを読み取ります。これは現在最高のバージョンです。v1.0.0
と v1.0.1
の両方が取り消されているため、go
コマンドは次の最高のバージョン(おそらく v0.9.5
)にアップグレード(またはダウングレード)します。
retract
ディレクティブは、単一のバージョン (v1.0.0
など) または、[
と ]
で区切られた上限と下限を持つバージョンの閉区間 ([v1.1.0, v1.2.0]
など) で記述できます。単一のバージョンは、上限と下限が同じである区間と同等です。他のディレクティブと同様に、複数の retract
ディレクティブを、行末の (
とその行だけの )
で区切られたブロックにグループ化できます。
各 retract
ディレクティブには、取り消しの理由を説明するコメントを含める必要がありますが、これは必須ではありません。go
コマンドは、取り消されたバージョンに関する警告や go list
の出力で、理由のコメントを表示する場合があります。理由のコメントは、retract
ディレクティブの直上に(空白行を挟まずに)記述するか、同じ行の後に記述できます。コメントがブロックの上部に表示される場合、そのコメントはそのブロック内の独自のコメントを持たないすべての retract
ディレクティブに適用されます。理由のコメントは複数行にわたる場合があります。
RetractDirective = "retract" ( RetractSpec | "(" newline { RetractSpec } ")" newline ) .
RetractSpec = ( Version | "[" Version "," Version "]" ) newline .
例
v1.0.0
とv1.9.9
の間のすべてのバージョンを取り消す
retract v1.0.0
retract [v1.0.0, v1.9.9]
retract (
v1.0.0
[v1.0.0, v1.9.9]
)
- バージョン
v1.0.0
を時期尚早にリリースした後、バージョンなしの状態に戻す
retract [v0.0.0, v1.0.1] // assuming v1.0.1 contains this retraction.
- 疑似バージョンとタグ付きバージョンを含むすべてのモジュールを削除する
retract [v0.0.0-0, v0.15.2] // assuming v0.15.2 contains this retraction.
retract
ディレクティブは Go 1.16 で追加されました。Go 1.15 以前では、メインモジュールの go.mod
ファイルに retract
ディレクティブが記述されている場合、エラーが報告され、依存関係の go.mod
ファイル内の retract
ディレクティブは無視されます。
自動更新
ほとんどのコマンドは、go.mod
に情報が不足している場合、または現実を正確に反映していない場合にエラーを報告します。これらの問題のほとんどは、go get
と go mod tidy
コマンドを使用して修正できます。さらに、ほとんどのモジュール認識コマンド (go build
、go test
など) では、-mod=mod
フラグを使用して、go
コマンドに go.mod
と go.sum
の問題を自動的に修正するように指示できます。
例として、次の go.mod
ファイルを考えてみます。
module example.com/M
go 1.16
require (
example.com/A v1
example.com/B v1.0.0
example.com/C v1.0.0
example.com/D v1.2.3
example.com/E dev
)
exclude example.com/D v1.2.3
-mod=mod
でトリガーされた更新では、非標準のバージョン識別子が標準の semver 形式に書き換えられるため、example.com/A
の v1
は v1.0.0
になり、example.com/E
の dev
は、dev
ブランチの最新のコミットの疑似バージョン(おそらく v0.0.0-20180523231146-b3f5c0f6e5f1
)になります。
更新により、要件が除外を尊重するように変更されるため、除外された example.com/D v1.2.3
の要件は、使用可能な次の example.com/D
のバージョン(おそらく v1.2.4
または v1.3.0
)を使用するように更新されます。
更新により、冗長な要件または誤解を招く要件が削除されます。たとえば、example.com/A v1.0.0
自体が example.com/B v1.2.0
と example.com/C v1.0.0
を必要とする場合、go.mod
の example.com/B v1.0.0
の要件は誤解を招きます (example.com/A
が v1.2.0
を必要とすることで上書きされるため)、example.com/C v1.0.0
の要件は冗長です (example.com/A
が同じバージョンを必要とすることで暗黙的に示されるため)。そのため、どちらも削除されます。メインモジュールに、example.com/B
または example.com/C
からパッケージを直接インポートするパッケージが含まれている場合、要件は保持されますが、実際に使用されているバージョンに更新されます。
最後に、更新により go.mod
が標準の書式でフォーマットされるため、将来の機械的な変更による差分が最小限になります。書式変更のみが必要な場合、go
コマンドは go.mod
を更新しません。
モジュールグラフはインポートステートメントの意味を定義するため、パッケージを読み込むコマンドはすべて go.mod
を使用し、更新できます。これには、go build
、go get
、go install
、go list
、go test
、go mod tidy
が含まれます。
Go 1.15 以前では、-mod=mod
フラグがデフォルトで有効になっていたため、更新が自動的に実行されていました。Go 1.16 以降では、go
コマンドは -mod=readonly
が設定されているかのように動作します。つまり、go.mod
の変更が必要な場合、go
コマンドはエラーを報告し、修正を提案します。
最小バージョン選択 (MVS)
Go は、パッケージをビルドする際に使用するモジュールバージョンのセットを選択するために、「最小バージョン選択 (MVS)」と呼ばれるアルゴリズムを使用します。MVS の詳細は、Russ Cox による最小バージョン選択で詳しく説明されています。
概念的には、MVS は、go.mod
ファイルで指定されたモジュールの有向グラフで動作します。グラフの各頂点はモジュールバージョンを表し、各エッジは、require
ディレクティブを使用して指定された、依存関係の最小必要なバージョンを表します。グラフは、メインモジュール(複数)の go.mod
ファイル内の exclude
と replace
ディレクティブ、および go.work
ファイル内の replace
ディレクティブによって変更できます。
MVS は、ビルド出力としてビルドリスト(ビルドに使用されるモジュールバージョンのリスト)を生成します。
MVS はメインモジュール(バージョンを持たないグラフ内の特別な頂点)から開始し、グラフをトラバースして、各モジュールの最高必要なバージョンを追跡します。トラバースの終了時に、最高必要なバージョンがビルドリストを構成します。これらは、すべての要件を満たす最小バージョンです。
ビルドリストは、go list -m all
コマンドで確認できます。他の依存関係管理システムとは異なり、ビルドリストは「ロック」ファイルに保存されません。MVS は決定論的であり、依存関係の新しいバージョンがリリースされてもビルドリストは変更されないため、MVS はすべてのモジュール認識コマンドの開始時に使用されます。
以下の図の例を考えてみましょう。メインモジュールは、バージョン 1.2 以上のモジュール A と、バージョン 1.2 以上のモジュール B を必要とします。A 1.2 と B 1.2 はそれぞれ C 1.3 と C 1.4 を必要とします。C 1.3 と C 1.4 はどちらも D 1.2 を必要とします。
MVS は、青で強調表示されたモジュールバージョンの go.mod
ファイルにアクセスして読み込みます。グラフのトラバーサルが終了すると、MVS は太字で示されたバージョン(A 1.2、B 1.2、C 1.4、および D 1.2)を含むビルドリストを返します。B と D の上位バージョンは使用可能ですが、MVS はそれらを必要とするものがないため選択しません。
置換
モジュールの内容(go.mod
ファイルを含む)は、メインモジュールの go.mod
ファイルまたはワークスペースの go.work
ファイルの replace
ディレクティブ を使用して置き換えることができます。replace
ディレクティブは、モジュールの特定のバージョンまたはモジュールのすべてのバージョンに適用できます。
置換によってモジュールグラフは変化します。置換されたモジュールは、置換前のバージョンとは異なる依存関係を持つ可能性があるためです。
以下の例を考えてみましょう。C 1.4がRに置換されています。RはD 1.2ではなくD 1.3に依存しているため、MVSはA 1.2、B 1.2、C 1.4(Rに置換)、D 1.3を含むビルドリストを返します。
除外
特定のバージョンでモジュールを除外することもできます。メインモジュールのgo.mod
ファイルでexclude
ディレクティブを使用します。
除外もモジュールグラフを変更します。バージョンが除外されると、モジュールグラフから削除され、そのバージョンへの依存関係は次の上位バージョンにリダイレクトされます。
以下の例を考えてみましょう。C 1.3が除外されています。MVSは、A 1.2がC 1.3ではなくC 1.4(次の上位バージョン)を必要としているかのように動作します。
アップグレード
go get
コマンドを使用して、モジュールのセットをアップグレードできます。アップグレードを実行するために、go
コマンドはMVSを実行する前に、訪問されたバージョンからアップグレードされたバージョンへのエッジを追加することでモジュールグラフを変更します。
以下の例を考えてみましょう。モジュールBは1.2から1.3に、Cは1.3から1.4に、Dは1.2から1.3にアップグレードできます。
アップグレード(およびダウングレード)によって、間接的な依存関係が追加または削除される場合があります。この場合、E 1.1とF 1.1は、E 1.1がB 1.3によって必要とされているため、アップグレード後にビルドリストに表示されます。
アップグレードを維持するために、go
コマンドはgo.mod
の要件を更新します。Bに対する要件をバージョン1.3に変更します。また、それらのバージョンはそうでなければ選択されないため、C 1.4とD 1.3に対する要件を// indirect
コメントと共に追加します。
ダウングレード
go get
コマンドを使用して、モジュールのセットをダウングレードすることもできます。ダウングレードを実行するために、go
コマンドは、ダウングレードされたバージョンより上のバージョンを削除することでモジュールグラフを変更します。また、削除されたバージョンに依存する他のモジュールのバージョンも削除します。それらは、依存関係のダウングレードされたバージョンと互換性がない可能性があるためです。メインモジュールがダウングレードによって削除されたモジュールバージョンを必要とする場合、要件は削除されていない以前のバージョンに変更されます。以前のバージョンがない場合、要件は削除されます。
以下の例を考えてみましょう。C 1.4に問題が見つかったため、C 1.3にダウングレードするとします。C 1.4はモジュールグラフから削除されます。B 1.2も、C 1.4以上を必要とするため削除されます。メインモジュールのBに対する要件は1.1に変更されます。
go get
は、引数の後に@none
サフィックスを使用して、依存関係を完全に削除することもできます。これはダウングレードと同様に機能します。指定されたモジュールのすべてのバージョンがモジュールグラフから削除されます。
モジュールグラフのプルーニング
メインモジュールがgo 1.17
以上の場合、最小バージョン選択(MVS)に使用されるモジュールグラフには、独自のgo.mod
ファイルでgo 1.17
以上を指定する各モジュール依存関係の直接的な要件のみが含まれます。ただし、そのモジュールのバージョンが、他の依存関係(go 1.16
以下)によっても(推移的に)必要とされている場合を除きます。(go 1.17
依存関係の推移的な依存関係は、モジュールグラフからプルーニングされます。)
go 1.17
のgo.mod
ファイルには、そのモジュール内の任意のパッケージまたはテストをビルドするために必要なすべての依存関係に対するrequireディレクティブが含まれているため、プルーニングされたモジュールグラフには、メインモジュールによって明示的に要求された任意の依存関係内のパッケージをgo build
またはgo test
するために必要なすべての依存関係が含まれます。特定のモジュールのパッケージまたはテストをビルドするために必要ないモジュールは、そのパッケージの実行時動作に影響を与えることはできないため、モジュールグラフからプルーニングされた依存関係は、そうでなければ無関係なモジュール間の干渉を引き起こすだけです。
要件がプルーニングされたモジュールは、モジュールグラフにまだ表示され、go list -m all
によってまだ報告されます。それらの選択されたバージョンは既知であり、明確に定義されており、パッケージはそれらのモジュールからロードできます(たとえば、他のモジュールからロードされたテストの推移的な依存関係として)。ただし、go
コマンドはこれらのモジュールのどの依存関係が満たされているかを容易に識別できないため、go build
およびgo test
の引数には、要件がプルーニングされたモジュールからのパッケージを含めることができません。go get
は、名前付きパッケージを含むモジュールを明示的な依存関係に昇格させることで、そのパッケージでgo build
またはgo test
を呼び出すことができます。
Go 1.16以前はモジュールグラフのプルーニングをサポートしていなかったため、推移的なgo 1.17
依存関係を含む依存関係の完全な推移的閉包は、go 1.16
以下のものを指定する各モジュールに対してまだ含まれています。(go 1.16
以下では、go.mod
ファイルには直接的な依存関係のみが含まれているため、すべての間接的な依存関係が含まれるようにするには、はるかに大きなグラフをロードする必要があります。)
go mod tidy
によってモジュールに対して記録されたgo.sum
ファイルには、そのgo
ディレクティブで指定されたバージョンより1つ下のGoバージョンが必要とするチェックサムがデフォルトで含まれています。そのため、go 1.17
モジュールには、Go 1.16によってロードされた完全なモジュールグラフに必要なチェックサムが含まれていますが、go 1.18
モジュールには、Go 1.17によってロードされたプルーニングされたモジュールグラフに必要なチェックサムのみが含まれます。-compat
フラグを使用して、デフォルトのバージョンを上書きできます(たとえば、go 1.17
モジュールでgo.sum
ファイルをより積極的にプルーニングする場合)。
詳細については、設計文書を参照してください。
遅延モジュール読み込み
モジュールグラフのプルーニングに追加されたより包括的な要件により、モジュール内で作業する場合にも別の最適化が可能になります。メインモジュールがgo 1.17
以上の場合、go
コマンドは、必要になるまで(そして、必要ない限り)完全なモジュールグラフのロードを回避します。代わりに、メインモジュールのgo.mod
ファイルのみをロードし、その後、それらの要件のみを使用してビルドするパッケージのロードを試みます。インポートするパッケージ(たとえば、メインモジュール外のpackageのテストの依存関係)がそれらの要件に見つからない場合、モジュールグラフの残りの部分がオンデマンドでロードされます。
モジュールグラフをロードせずにすべてのインポートされたパッケージが見つかった場合、go
コマンドはそれらのパッケージを含むモジュールのgo.mod
ファイルのみをロードし、それらの要件はメインモジュールの要件に対してチェックされて、ローカルで整合性があることを確認します。(整合性の不一致は、バージョン管理のマージ、手動編集、およびローカルファイルシステムパスを使用して置換されたモジュールの変更によって発生する可能性があります。)
ワークスペース
ワークスペースとは、ディスク上のモジュールの集合であり、最小バージョン選択(MVS)を実行するときにメインモジュールとして使用されます。
ワークスペースは、ワークスペース内の各モジュールのモジュールディレクトリへの相対パスを指定するgo.work
ファイルで宣言できます。go.work
ファイルが存在しない場合、ワークスペースは現在のディレクトリを含む単一のモジュールで構成されます。
モジュールを操作するほとんどのgo
サブコマンドは、現在のワークスペースによって決定されたモジュールのセットに対して動作します。go mod init
、go mod why
、go mod edit
、go mod tidy
、go mod vendor
、およびgo get
は常に単一のメインモジュールに対して動作します。
コマンドは、最初にGOWORK
環境変数を調べて、ワークスペースコンテキスト内にあるかどうかを判断します。GOWORK
がoff
に設定されている場合、コマンドは単一モジュールコンテキストになります。空の場合、または提供されていない場合、コマンドは現在の作業ディレクトリ、次に連続する親ディレクトリを検索して、go.work
ファイルを探します。ファイルが見つかった場合、コマンドはそれが定義するワークスペースで動作します。そうでない場合、ワークスペースには作業ディレクトリを含むモジュールのみが含まれます。GOWORK
が`.work`で終わる既存のファイルへのパスを指定する場合、ワークスペースモードが有効になります。それ以外の値はエラーです。go env GOWORK
コマンドを使用して、go
コマンドが使用しているgo.work
ファイルを確認できます。go
コマンドがワークスペースモードでない場合、go env GOWORK
は空になります。
go.work
ファイル
ワークスペースは、UTF-8でエンコードされたテキストファイル(go.work
という名前)によって定義されます。go.work
ファイルは行指向です。各行は、キーワードと引数で構成される単一のディレクティブを保持します。たとえば
go 1.18
use ./my/first/thing
use ./my/second/thing
replace example.com/bad/thing v1.4.5 => example.com/good/thing v1.4.5
go.mod
ファイルと同様に、先行するキーワードを隣接する行から要因分解してブロックを作成できます。
use (
./my/first/thing
./my/second/thing
)
go
コマンドは、go.work
ファイルを操作するためのいくつかのサブコマンドを提供します。go work init
は新しいgo.work
ファイルを作成します。go work use
はモジュールディレクトリをgo.work
ファイルに追加します。go work edit
は低レベルの編集を実行します。golang.org/x/mod/modfile
パッケージは、Goプログラムが同じ変更をプログラム的に行うために使用できます。
goコマンドは、集合ワークスペースモジュールのgo.sumファイルにないワークスペースで使用されるハッシュを追跡するgo.work.sum
ファイルを維持します。
一般的に、2つの理由から、go.work
ファイルをバージョン管理システムにコミットすることはお勧めできません。
- チェックインされた
go.work
ファイルは、親ディレクトリからの開発者自身のgo.work
ファイルよりも優先される可能性があり、それらのuse
ディレクティブが適用されない場合に混乱が生じます。 - チェックインされた
go.work
ファイルにより、継続的インテグレーション(CI)システムがモジュールの依存関係の誤ったバージョンを選択してテストする可能性があります。CIシステムは、一般的にgo.work
ファイルを使用することを許可しないようにする必要があります。これにより、モジュールが他のモジュールによって要求された場合にどのように使用されるか、つまりモジュール内のgo.work
ファイルが無効な状態での動作をテストできます。
とはいえ、go.work
ファイルをコミットすることが理にかなう場合もあります。たとえば、リポジトリ内のモジュールが互いに排他的に開発され、外部モジュールと同時に開発されない場合、開発者がワークスペースで異なるモジュールの組み合わせを使用したい理由がない場合があります。その場合、モジュール作成者は、個々のモジュールが正しくテストされ、リリースされていることを確認する必要があります。
字句要素
go.work
ファイル内の字句要素は、go.modファイル
とまったく同じ方法で定義されています。
文法
go.work
構文は、拡張バッカス・ナウア記法(EBNF)を使用して以下に指定されています。EBNF構文の詳細については、Go言語仕様の表記セクションを参照してください。
GoWork = { Directive } .
Directive = GoDirective |
ToolchainDirective |
UseDirective |
ReplaceDirective .
改行、識別子、文字列は、それぞれnewline
、ident
、string
で示されます。
モジュールパスとバージョンは、ModulePath
とVersion
で表されます。モジュールパスとバージョンは、go.modファイル
とまったく同じ方法で指定されています。
ModulePath = ident | string . /* see restrictions above */
Version = ident | string . /* see restrictions above */
go
ディレクティブ
有効なgo.work
ファイルには、go
ディレクティブが必要です。バージョンは有効なGoリリースバージョンである必要があります。正の整数にドットと非負の整数が続きます(たとえば、1.18
、1.19
)。
go
ディレクティブは、go.work
ファイルが動作することを意図するGoツールチェーンのバージョンを示します。go.work
ファイルの形式に変更が加えられた場合、将来のバージョンのツールチェーンは、その指定されたバージョンに従ってファイルを解釈します。
go.work
ファイルには、go
ディレクティブを最大1つ含めることができます。
GoDirective = "go" GoVersion newline .
GoVersion = string | ident . /* valid release version; see above */
例
go 1.18
toolchain
ディレクティブ
toolchain
ディレクティブは、ワークスペースで使用することを推奨するGoツールチェーンを宣言します。これは、デフォルトのツールチェーンが推奨されるツールチェーンより古い場合にのみ効果があります。
詳細については、「Goツールチェーン」を参照してください。
ToolchainDirective = "toolchain" ToolchainName newline .
ToolchainName = string | ident . /* valid toolchain name; see “Go toolchains” */
例
toolchain go1.21.0
godebug
ディレクティブ
godebug
ディレクティブは、このワークスペースで作業する際に適用する単一のGODEBUG 設定を宣言します。構文と効果は、go.mod
ファイルの godebug
ディレクティブ と同じです。ワークスペースが使用されている場合、go.mod
ファイル内の godebug
ディレクティブは無視されます。
use
ディレクティブ
use
は、ディスク上のモジュールをワークスペースのメインモジュールのセットに追加します。その引数は、モジュールの go.mod
ファイルを含むディレクトリへの相対パスです。use
ディレクティブは、その引数ディレクトリのサブディレクトリに含まれるモジュールを追加しません。これらのモジュールは、個別の use
ディレクティブで、それらの go.mod
ファイルを含むディレクトリによって追加できます。
UseDirective = "use" ( UseSpec | "(" newline { UseSpec } ")" newline ) .
UseSpec = FilePath newline .
FilePath = /* platform-specific relative or absolute file path */
例
use ./mymod // example.com/mymod
use (
../othermod
./subdir/thirdmod
)
replace
ディレクティブ
go.mod
ファイルの replace
ディレクティブと同様に、go.work
ファイルの replace
ディレクティブは、モジュールの特定のバージョン、またはモジュールのすべてのバージョンの内容を、別の場所に存在する内容に置き換えます。go.work
のワイルドカード置換は、go.mod
ファイルのバージョン固有の replace
をオーバーライドします。
go.work
ファイルの replace
ディレクティブは、ワークスペースモジュール内の同じモジュールまたはモジュールバージョンの置換をオーバーライドします。
ReplaceDirective = "replace" ( ReplaceSpec | "(" newline { ReplaceSpec } ")" newline ) .
ReplaceSpec = ModulePath [ Version ] "=>" FilePath newline
| ModulePath [ Version ] "=>" ModulePath Version newline .
FilePath = /* platform-specific relative or absolute file path */
例
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
replace (
golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
golang.org/x/net => example.com/fork/net v1.4.5
golang.org/x/net v1.2.3 => ./fork/net
golang.org/x/net => ./fork/net
)
非モジュールリポジトリとの互換性
GOPATH
からモジュールへのスムーズな移行を保証するために、go
コマンドは、go.mod
ファイル を追加することで、モジュールに移行していないリポジトリからモジュール認識モードでパッケージをダウンロードしてビルドできます。
go
コマンドが特定のバージョンでモジュールを直接リポジトリからダウンロードする場合、モジュールパスのリポジトリURLを検索し、バージョンをリポジトリ内のリビジョンにマップしてから、そのリビジョンでのリポジトリのアーカイブを抽出します。モジュールのパスがリポジトリのルートパスと等しく、リポジトリのルートディレクトリに go.mod
ファイルが含まれていない場合、go
コマンドは、module
ディレクティブのみを含む go.mod
ファイルをモジュールキャッシュに合成します。合成された go.mod
ファイルには、その依存関係に対するrequire
ディレクティブが含まれていないため、それらに依存する他のモジュールは、追加の require
ディレクティブ(// indirect
コメント付き)が必要になる場合があります。これは、すべてのビルドで各依存関係が同じバージョンでフェッチされるようにするためです。
go
コマンドがプロキシからモジュールをダウンロードする場合、モジュールの残りのコンテンツとは別に go.mod
ファイルをダウンロードします。プロキシは、元のモジュールに go.mod
ファイルがない場合、合成された go.mod
ファイルを提供することが期待されます。
+incompatible
バージョン
メジャーバージョン2以上でリリースされたモジュールは、そのモジュールパスに一致するメジャーバージョンサフィックスが必要です。たとえば、モジュールが v2.0.0
でリリースされた場合、そのパスには /v2
サフィックスが必要です。これにより、go
コマンドは、同じリポジトリで開発されている場合でも、プロジェクトの複数のメジャーバージョンを別々のモジュールとして扱うことができます。
メジャーバージョンサフィックスの要件は、モジュールサポートが go
コマンドに追加されたときに導入されました。多くのリポジトリは、それより前にメジャーバージョン 2
以上でリリースをタグ付けしていました。これらのリポジトリとの互換性を維持するために、go
コマンドは、go.mod
ファイルを持たないメジャーバージョン2以上のバージョンに +incompatible
サフィックスを追加します。+incompatible
は、バージョンがより低いメジャーバージョン番号を持つバージョンと同じモジュールの一部であることを示しています。その結果、ビルドが中断される可能性がある場合でも、go
コマンドはより高い +incompatible
バージョンに自動的にアップグレードすることがあります。
以下の要件の例を考えてみましょう。
require example.com/m v4.1.2+incompatible
バージョン v4.1.2+incompatible
は、モジュール example.com/m
を提供するリポジトリのセマンティックバージョンタグ v4.1.2
を参照します。モジュールはリポジトリのルートディレクトリに存在する必要があり(つまり、リポジトリのルートパスも example.com/m
である必要があります)、go.mod
ファイルが存在してはなりません。モジュールには、v1.5.2
のようなより低いメジャーバージョン番号を持つバージョンが存在し、go
コマンドはこれらのバージョンから v4.1.2+incompatible
に自動的にアップグレードすることがあります(アップグレードのしくみについては、最小バージョン選択(MVS)を参照してください)。
バージョン v2.0.0
がタグ付けされた後にモジュールに移行するリポジトリは、通常、新しいメジャーバージョンをリリースする必要があります。上記の例では、作成者は example.com/m/v5
というパスを持つモジュールを作成し、バージョン v5.0.0
をリリースする必要があります。作成者は、モジュール内のパッケージのインポートを更新して、example.com/m
の代わりに example.com/m/v5
というプレフィックスを使用する必要があります。より詳細な例については、Go Modules: v2 and Beyond を参照してください。
+incompatible
サフィックスは、リポジトリのタグには表示されないことに注意してください。v4.1.2+incompatible
のようなタグは無視されます。サフィックスは、go
コマンドで使用されるバージョンにのみ表示されます。バージョンとタグの違いの詳細については、バージョンとコミットのマッピング を参照してください。
また、+incompatible
サフィックスは疑似バージョンに表示される場合があることにも注意してください。たとえば、v2.0.1-20200722182040-012345abcdef+incompatible
は有効な疑似バージョンです。
最小モジュール互換性
メジャーバージョン2以上でリリースされたモジュールは、そのモジュールパスにメジャーバージョンサフィックスが必要です。モジュールは、リポジトリ内のメジャーバージョンサブディレクトリで開発されている場合とされていない場合があります。これは、GOPATH
モードでビルドする際に、モジュール内のパッケージをインポートするパッケージに影響を与えます。
通常、GOPATH
モードでは、パッケージは、そのリポジトリのルートパスとリポジトリ内のディレクトリを結合したディレクトリに格納されます。たとえば、ルートパスが example.com/repo
で、サブディレクトリが sub
であるリポジトリのパッケージは、$GOPATH/src/example.com/repo/sub
に格納され、example.com/repo/sub
としてインポートされます。
メジャーバージョンサフィックスを持つモジュールの場合、パッケージ example.com/repo/v2/sub
はディレクトリ $GOPATH/src/example.com/repo/v2/sub
にあることが予想されます。そのためには、モジュールをリポジトリの v2
サブディレクトリで開発する必要があります。go
コマンドはこれをサポートしますが、要求しません(バージョンとコミットのマッピングを参照してください)。
モジュールがメジャーバージョンサブディレクトリで開発されていない場合、GOPATH
内のそのディレクトリにはメジャーバージョンサフィックスが含まれず、そのパッケージはメジャーバージョンサフィックスなしでインポートできます。上記の例では、パッケージはディレクトリ $GOPATH/src/example.com/repo/sub
にあり、example.com/repo/sub
としてインポートされます。
これにより、モジュールモードと GOPATH
モードの両方でビルドされることを意図したパッケージに問題が発生します。モジュールモードにはサフィックスが必要ですが、GOPATH
モードには必要ありません。
これを修正するために、Go 1.11 で最小モジュール互換性が追加され、Go 1.9.7 および 1.10.3 にバックポートされました。インポートパスが GOPATH
モードでディレクトリに解決されるとき
$modpath/$vn/$dir
の形式のインポートを解決するとき、$modpath
は有効なモジュールパスであり、$vn
はメジャーバージョンサフィックスであり、$dir
は空の可能性のあるサブディレクトリである場合、
- 次のすべてが true の場合
- パッケージ
$modpath/$vn/$dir
は、関連するvendor
ディレクトリに存在しません。 - インポートファイルと同じディレクトリ、または
$GOPATH/src
ルートまでの親ディレクトリにgo.mod
ファイルが存在します。 $GOPATH[i]/src/$modpath/$vn/$suffix
ディレクトリは存在しません(任意のルート$GOPATH[i]
について)。- ファイル
$GOPATH[d]/src/$modpath/go.mod
が存在し(あるルート$GOPATH[d]
について)、モジュールパスを$modpath/$vn
として宣言します。
- パッケージ
- その場合、
$modpath/$vn/$dir
のインポートは、ディレクトリ$GOPATH[d]/src/$modpath/$dir
に解決されます。
これらのルールにより、メジャーバージョンサブディレクトリが使用されていない場合でも、GOPATH
モードでビルドするときに、モジュールに移行されたパッケージが、他のモジュールに移行されたパッケージをインポートできるようになります。
モジュール認識コマンド
ほとんどの go
コマンドは、モジュール認識モードまたはGOPATH
モードで実行できます。モジュール認識モードでは、go
コマンドは go.mod
ファイルを使用してバージョン付きの依存関係を見つけ、通常はモジュールキャッシュからパッケージを読み込み、不足しているモジュールをダウンロードします。GOPATH
モードでは、go
コマンドはモジュールを無視し、依存関係を見つけるためにvendor
ディレクトリと GOPATH
を検索します。
Go 1.16 以降、go.mod
ファイルが存在するかに関係なく、モジュール認識モードがデフォルトで有効になっています。それ以前のバージョンでは、モジュール認識モードは、現在のディレクトリまたは任意の親ディレクトリに go.mod
ファイルが存在する場合に有効になっていました。
モジュール認識モードは、GO111MODULE
環境変数で制御できます。この変数は、on
、off
、または auto
に設定できます。
GO111MODULE=off
の場合、go
コマンドはgo.mod
ファイルを無視し、GOPATH
モードで実行されます。GO111MODULE=on
の場合、または設定されていない場合、go.mod
ファイルが存在しない場合でも、go
コマンドはモジュール認識モードで実行されます。すべてのコマンドがgo.mod
ファイルなしで動作するわけではありません。モジュール外のモジュールコマンドを参照してください。GO111MODULE=auto
の場合、現在のディレクトリまたは任意の親ディレクトリにgo.mod
ファイルが存在する場合、go
コマンドはモジュール認識モードで実行されます。Go 1.15 以前では、これがデフォルトの動作でした。go mod
サブコマンドと、バージョン照会 を伴うgo install
は、go.mod
ファイルが存在しない場合でも、モジュール認識モードで実行されます。
モジュール認識モードでは、GOPATH
はビルド中のインポートの意味を定義しなくなりましたが、ダウンロードされた依存関係(GOPATH/pkg/mod
にあります。モジュールキャッシュを参照)とインストールされたコマンド(GOBIN
が設定されていない限り、GOPATH/bin
にあります)は引き続き格納します。
ビルドコマンド
パッケージに関する情報をロードするすべてのコマンドは、モジュール認識機能を備えています。これには以下が含まれます。
go build
go fix
go generate
go install
go list
go run
go test
go vet
モジュール認識モードで実行されると、これらのコマンドは go.mod
ファイルを使用して、コマンドラインにリストされているか、Go ソースファイルに記述されているインポートパスを解釈します。これらのコマンドは、すべてのモジュールコマンドに共通する次のフラグを受け入れます。
-mod
フラグは、go.mod
を自動的に更新できるかどうか、およびvendor
ディレクトリが使用されるかどうかを制御します。-mod=mod
は、go
コマンドにvendor
ディレクトリを無視し、インポートされたパッケージが既知のモジュールによって提供されていない場合など、go.mod
を自動的に更新するように指示します。-mod=readonly
は、go
コマンドにvendor
ディレクトリを無視し、go.mod
の更新が必要な場合はエラーを報告するように指示します。-mod=vendor
は、go
コマンドにvendor
ディレクトリを使用するように指示します。このモードでは、go
コマンドはネットワークまたはモジュールキャッシュを使用しません。- デフォルトでは、
go.mod
のgo
バージョンが1.14
以上であり、vendor
ディレクトリが存在する場合、go
コマンドは-mod=vendor
が使用されているかのように動作します。それ以外の場合は、go
コマンドは-mod=readonly
が使用されているかのように動作します。 go get
コマンドは、このフラグを拒否します。このコマンドの目的は依存関係の変更であり、-mod=mod
でのみ許可されるためです。
-modcacherw
フラグは、go
コマンドに、モジュールキャッシュ内に新しいディレクトリを作成する際に、読み取り専用ではなく読み書き権限で作成するよう指示します。このフラグを一貫して使用する場合(通常は環境変数にGOFLAGS=-modcacherw
を設定するか、go env -w GOFLAGS=-modcacherw
を実行することで)、権限を変更せずにrm -r
などのコマンドでモジュールキャッシュを削除できます。go clean -modcache
コマンドは、-modcacherw
が使用されたかどうかに関係なく、モジュールキャッシュを削除するために使用できます。-modfile=file.mod
フラグは、go
コマンドに、モジュールルートディレクトリのgo.mod
の代わりに、別のファイルを読み書きするよう指示します。ファイル名は.mod
で終わる必要があります。モジュールルートディレクトリを決定するために、go.mod
という名前のファイルは存在する必要がありますが、アクセスされません。-modfile
が指定されている場合、別のgo.sum
ファイルも使用されます。そのパスは、-modfile
フラグから.mod
拡張子を削除し、.sum
を追加することで導出されます。
ベンダーリング
モジュールを使用する場合、go
コマンドは通常、モジュールキャッシュにソースからモジュールをダウンロードしてから、ダウンロードしたコピーからパッケージを読み込むことで、依存関係を満たします。 ベンダーリング は、古いバージョンの Go との相互運用を許可したり、ビルドに使用されるすべてのファイルが単一のファイルツリーに格納されるようにするために使用できます。
go mod vendor
コマンドは、メインモジュールのルートディレクトリに vendor
という名前のディレクトリを作成し、メインモジュール内のパッケージをビルドおよびテストするために必要なすべてのパッケージのコピーを含みます。メインモジュール外の他のパッケージのテストによってのみインポートされるパッケージは含まれません。go mod tidy
などの他のモジュールコマンドと同様に、ビルド制約(ignore
を除く)は、vendor
ディレクトリを作成する際に考慮されません。
go mod vendor
は、ベンダーされたパッケージとそのコピー元のモジュールバージョンの一覧を含む vendor/modules.txt
ファイルも作成します。ベンダーリングが有効になっている場合、このマニフェストは、go list -m
と go version -m
によって報告されるモジュールバージョン情報のソースとして使用されます。go
コマンドが vendor/modules.txt
を読み取ると、モジュールバージョンが go.mod
と一致しているかどうかを確認します。vendor/modules.txt
が生成されてから go.mod
が変更された場合、go
コマンドはエラーを報告します。vendor
ディレクトリを更新するには、go mod vendor
を再度実行する必要があります。
メインモジュールのルートディレクトリに vendor
ディレクトリが存在する場合、メインモジュールのgo.mod
ファイル内のgo
バージョンが 1.14
以上であれば、自動的に使用されます。ベンダーリングを明示的に有効にするには、-mod=vendor
フラグを付けて go
コマンドを呼び出します。ベンダーリングを無効にするには、-mod=readonly
または -mod=mod
フラグを使用します。
ベンダーリングが有効になっている場合、go build
や go test
などのビルドコマンドは、ネットワークまたはローカルモジュールキャッシュにアクセスする代わりに、vendor
ディレクトリからパッケージを読み込みます。go list -m
コマンドは、go.mod
にリストされているモジュールに関する情報のみを出力します。go mod download
や go mod tidy
などの go mod
コマンドは、ベンダーリングが有効になっている場合でも動作が変わりません。モジュールをダウンロードし、モジュールキャッシュにアクセスします。go get
も、ベンダーリングが有効になっている場合でも動作が変わりません。
GOPATH
モードでのベンダーリングとは異なり、go
コマンドは、メインモジュールのルートディレクトリ以外の場所にあるベンダーディレクトリを無視します。さらに、他のモジュール内のベンダーディレクトリは使用されないため、go
コマンドはモジュールzipファイルをビルドするときにベンダーディレクトリを含めません(ただし、既知のバグ#31562と#37397を参照)。
go get
使用方法
go get [-d] [-t] [-u] [build flags] [packages]
例
# Upgrade a specific module.
$ go get golang.org/x/net
# Upgrade modules that provide packages imported by packages in the main module.
$ go get -u ./...
# Upgrade or downgrade to a specific version of a module.
$ go get golang.org/x/text@v0.3.2
# Update to the commit on the module's master branch.
$ go get golang.org/x/text@master
# Remove a dependency on a module and downgrade modules that require it
# to versions that don't require it.
$ go get golang.org/x/text@none
# Upgrade the minimum required Go version for the main module.
$ go get go
# Upgrade the suggested Go toolchain, leaving the minimum Go version alone.
$ go get toolchain
# Upgrade to the latest patch release of the suggested Go toolchain.
$ go get toolchain@patch
go get
コマンドは、メインモジュールのgo.mod
ファイルのモジュール依存関係を更新し、その後、コマンドラインにリストされているパッケージをビルドしてインストールします。
最初のステップは、更新するモジュールを決定することです。go get
は、パッケージ、パッケージパターン、モジュールパスのリストを引数として受け入れます。パッケージ引数が指定されている場合、go get
はそのパッケージを提供するモジュールを更新します。パッケージパターンが指定されている場合(たとえば、all
や ...
ワイルドカード付きのパス)、go get
はパターンをパッケージのセットに展開し、パッケージを提供するモジュールを更新します。引数がモジュールを名前付けしているがパッケージを名前付けていない場合(たとえば、モジュール golang.org/x/net
にはルートディレクトリにパッケージがありません)、go get
はモジュールを更新しますが、パッケージはビルドしません。引数が指定されていない場合、go get
は .
が指定されたものとして動作します(現在のディレクトリのパッケージ)。これは、-u
フラグと組み合わせて、インポートされたパッケージを提供するモジュールを更新するために使用できます。
各引数には、目的のバージョンを示すバージョン照会サフィックスを含めることができます(例:go get golang.org/x/text@v0.3.0
)。バージョン照会サフィックスは、@
記号に続いてバージョン照会で構成され、特定のバージョン(v0.3.0
)、バージョン接頭辞(v0.3
)、ブランチ名またはタグ名(master
)、リビジョン(1234abcd
)、または特別な照会 latest
、upgrade
、patch
、none
のいずれかを指定できます。バージョンが指定されていない場合、go get
は @upgrade
照会を使用します。
go get
が引数を特定のモジュールとバージョンに解決すると、go get
は、メインモジュールの go.mod
ファイルのrequire
ディレクティブを追加、変更、または削除して、モジュールが将来も目的のバージョンを維持するようにします。go.mod
ファイルの必須バージョンは最小バージョンであり、新しい依存関係が追加されると自動的に増加する可能性があることに注意してください。バージョンがどのように選択され、モジュール認識コマンドによって競合がどのように解決されるかについては、最小バージョン選択(MVS)を参照してください。
コマンドラインで名前付けされたモジュールが追加、アップグレード、またはダウングレードされると、他のモジュールがアップグレードされる場合があります。新しいバージョンの名前付きモジュールが他のモジュールをより高いバージョンで要求する場合です。たとえば、モジュール example.com/a
がバージョン v1.5.0
にアップグレードされ、そのバージョンがモジュール example.com/b
をバージョン v1.2.0
で要求するとします。モジュール example.com/b
が現在バージョン v1.1.0
で要求されている場合、go get example.com/a@v1.5.0
は example.com/b
も v1.2.0
にアップグレードします。
コマンドラインで名前付けされたモジュールがダウングレードまたは削除されると、他のモジュールがダウングレードされる場合があります。上記の例を続けると、モジュール example.com/b
が v1.1.0
にダウングレードされるとします。モジュール example.com/a
も、バージョン v1.1.0
以下で example.com/b
を必要とするバージョンにダウングレードされます。
バージョンサフィックス @none
を使用して、モジュールの要件を削除できます。これは一種の特別なダウングレードです。削除されたモジュールに依存するモジュールは、必要に応じてダウングレードまたは削除されます。そのパッケージの1つ以上がメインモジュールのパッケージによってインポートされている場合でも、モジュールの要件を削除できます。この場合、次のビルドコマンドで新しいモジュールの要件が追加される可能性があります。
モジュールが2つの異なるバージョン(コマンドライン引数で明示的に指定するか、アップグレードとダウングレードを満たすために指定)で必要とされる場合、go get
はエラーを報告します。
go get
が新しいバージョンのセットを選択した後、新しく選択されたモジュールバージョン、またはコマンドラインで名前付けされたパッケージを提供するモジュールがリトラクトされているか非推奨かどうかを確認します。go get
は、検出されたリトラクトされたバージョンまたは非推奨のモジュールごとに警告を出力します。go list -m -u all
を使用して、すべての依存関係のリトラクションと非推奨を確認できます。
go get
が go.mod
ファイルを更新した後、コマンドラインで名前付けされたパッケージをビルドします。実行ファイルは、GOBIN
環境変数によって名前付けされたディレクトリにインストールされます。これは、GOPATH
環境変数が設定されていない場合、$GOPATH/bin
または $HOME/go/bin
をデフォルトとします。
go get
は次のフラグをサポートします。
-d
フラグは、go get
にパッケージをビルドまたはインストールしないように指示します。-d
が使用されている場合、go get
はgo.mod
の依存関係のみを管理します。パッケージをビルドしてインストールするために-d
なしでgo get
を使用することは、非推奨です(Go 1.17 以降)。Go 1.18 では、-d
は常に有効になります。-u
フラグは、コマンドラインで名前付けされたパッケージによって直接または間接的にインポートされたパッケージを提供するモジュールをアップグレードするようにgo get
に指示します。-u
によって選択された各モジュールは、より高いバージョン(プレリリース)ですでに要求されていない限り、最新のバージョンにアップグレードされます。-u=patch
フラグ(-u patch
ではない)も依存関係をアップグレードするようにgo get
に指示しますが、go get
は各依存関係を最新の patch バージョンにアップグレードします(@patch
バージョン照会に似ています)。-t
フラグは、コマンドラインで名前付けされたパッケージのテストをビルドするために必要なモジュールを考慮するようにgo get
に指示します。-t
と-u
を一緒に使用すると、go get
はテストの依存関係も更新します。-insecure
フラグは、もはや使用しないでください。HTTP などの安全でないスキームを使用して、カスタムインポートパスを解決し、リポジトリとモジュールプロキシからフェッチすることを許可します。環境変数であるGOINSECURE
は、より詳細な制御を提供し、代わりに使用してください。
Go 1.16 以降、go install
はプログラムのビルドとインストールに推奨されるコマンドです。バージョンサフィックス(@latest
や @v1.4.6
など)と一緒に使用すると、go install
はモジュール認識モードでパッケージをビルドし、現在のディレクトリまたは親ディレクトリ(存在する場合)の go.mod
ファイルを無視します。
go get
は、go.mod
の要件の管理に重点を置いています。-d
フラグは非推奨であり、Go 1.18 では常に有効になります。
go install
使用方法
go install [build flags] [packages]
例
# Install the latest version of a program,
# ignoring go.mod in the current directory (if any).
$ go install golang.org/x/tools/gopls@latest
# Install a specific version of a program.
$ go install golang.org/x/tools/gopls@v0.6.4
# Install a program at the version selected by the module in the current directory.
$ go install golang.org/x/tools/gopls
# Install all programs in a directory.
$ go install ./cmd/...
go install
コマンドは、コマンドラインのパスによって名前付けされたパッケージをビルドしてインストールします。実行ファイル(main
パッケージ)は、GOBIN
環境変数によって名前付けされたディレクトリにインストールされます。これは、GOPATH
環境変数が設定されていない場合、$GOPATH/bin
または $HOME/go/bin
をデフォルトとします。$GOROOT
内の実行ファイルは、$GOBIN
の代わりに $GOROOT/bin
または $GOTOOLDIR
にインストールされます。実行可能ではないパッケージはビルドされキャッシュされますが、インストールされません。
Go 1.16 以降、引数にバージョンサフィックス(@latest
や @v1.0.0
など)がある場合、go install
はモジュール認識モードでパッケージをビルドし、現在のディレクトリまたは親ディレクトリ(存在する場合)の go.mod
ファイルを無視します。これは、メインモジュールの依存関係に影響を与えることなく実行ファイルをインストールする場合に役立ちます。
ビルドで使用されるモジュールバージョンに関する曖昧さを排除するために、引数は以下の制約を満たす必要があります。
- 引数は、パッケージパスまたはパッケージパターン(「
...
」ワイルドカードを使用)でなければなりません。標準パッケージ(fmt
など)、メタパターン(std
、cmd
、all
)、相対パスまたは絶対ファイルパスであってはなりません。 - すべての引数は、同じバージョンサフィックスを持たなければなりません。同じバージョンを参照していても、異なるクエリは許可されません。
- すべての引数は、同じモジュール内の同じバージョンにあるパッケージを参照しなければなりません。
- パッケージパス引数は、
main
パッケージを参照しなければなりません。パターン引数は、main
パッケージのみに一致します。 - どのモジュールもメインモジュールとはみなされません。
- コマンドラインで指定されたパッケージを含むモジュールに
go.mod
ファイルが存在する場合、それがメインモジュールである場合と異なる解釈を引き起こすディレクティブ(replace
およびexclude
)を含んではなりません。 - モジュールは、それ自身のより高いバージョンを要求してはなりません。
- ベンダーディレクトリは、どのモジュールでも使用されません。(ベンダーディレクトリはモジュールzipファイルに含まれていないため、
go install
はそれらをダウンロードしません。)
- コマンドラインで指定されたパッケージを含むモジュールに
サポートされているバージョン問い合わせ構文については、バージョン問い合わせを参照してください。Go 1.15以前では、go install
でバージョン問い合わせを使用することができませんでした。
引数にバージョンサフィックスがない場合、go install
は、GO111MODULE
環境変数とgo.mod
ファイルの存在に応じて、モジュール認識モードまたはGOPATH
モードで実行される場合があります。詳細については、モジュール認識コマンドを参照してください。モジュール認識モードが有効になっている場合、go install
はメインモジュールのコンテキストで実行されますが、これはインストールされているパッケージを含むモジュールとは異なる場合があります。
go list -m
使用方法
go list -m [-u] [-retracted] [-versions] [list flags] [modules]
例
$ go list -m all
$ go list -m -versions example.com/m
$ go list -m -json example.com/m@latest
-m
フラグにより、go list
はパッケージではなくモジュールを一覧表示します。このモードでは、go list
への引数は、モジュール、モジュールパターン(...
ワイルドカードを含む)、バージョン問い合わせ、またはビルドリスト内のすべてのモジュールに一致する特殊パターンall
ですることができます。引数を指定しない場合、メインモジュールが一覧表示されます。
モジュールを一覧表示する場合、-f
フラグはGo構造体に適用されるフォーマットテンプレートを指定しますが、現在はModule
構造体になります。
type Module struct {
Path string // module path
Version string // module version
Versions []string // available module versions
Replace *Module // replaced by this module
Time *time.Time // time version was created
Update *Module // available update (with -u)
Main bool // is this the main module?
Indirect bool // module is only indirectly needed by main module
Dir string // directory holding local copy of files, if any
GoMod string // path to go.mod file describing module, if any
GoVersion string // go version used in module
Retracted []string // retraction information, if any (with -retracted or -u)
Deprecated string // deprecation message, if any (with -u)
Error *ModuleError // error loading module
}
type ModuleError struct {
Err string // the error itself
}
デフォルトの出力は、モジュールパスを出力し、次にバージョンと置換に関する情報を表示することです。たとえば、go list -m all
は次のように出力される場合があります。
example.com/main/module
golang.org/x/net v0.1.0
golang.org/x/text v0.3.0 => /tmp/text
rsc.io/pdf v0.1.1
Module
構造体には、この出力行をフォーマットするString
メソッドがあるため、デフォルトのフォーマットは-f '{{.String}}'
と同じになります。
モジュールが置換されている場合、そのReplace
フィールドは置換モジュールを記述し、Dir
フィールドは、存在する場合は置換モジュールのソースコードに設定されます。(つまり、Replace
がnull以外の場合、Dir
はReplace.Dir
に設定され、置換されたソースコードにはアクセスできません。)
-u
フラグは、利用可能なアップグレードに関する情報を追加します。特定のモジュールの最新バージョンが現在のバージョンよりも新しい場合、list -u
はモジュールのUpdate
フィールドを新しいモジュールに関する情報に設定します。list -u
は、現在選択されているバージョンがリトラクトされているか、モジュールが非推奨であるかも出力します。モジュールのString
メソッドは、現在のバージョンの後に新しいバージョンを括弧で囲んでフォーマットすることにより、利用可能なアップグレードを示します。たとえば、go list -m -u all
は次のように出力される場合があります。
example.com/main/module
golang.org/x/old v1.9.9 (deprecated)
golang.org/x/net v0.1.0 (retracted) [v0.2.0]
golang.org/x/text v0.3.0 [v0.4.0] => /tmp/text
rsc.io/pdf v0.1.1 [v0.1.2]
(ツールの場合、go list -m -u -json all
の方が解析が容易です。)
-versions
フラグにより、list
はモジュールのVersions
フィールドを、そのモジュールのすべての既知のバージョン(セマンティックバージョニングに従って、最も低い順に並べ替えられたもの)のリストに設定します。このフラグは、デフォルトの出力形式も変更し、モジュールパスにスペースで区切られたバージョンリストを続けて表示します。リトラクトされたバージョンはこのリストから省略されますが、-retracted
フラグも指定されている場合は除きます。
-retracted
フラグは、-versions
フラグで出力されるリストにリトラクトされたバージョンを表示し、バージョン問い合わせを解決する際にリトラクトされたバージョンを考慮するようにlist
に指示します。たとえば、go list -m -retracted example.com/m@latest
は、そのバージョンがリトラクトされている場合でも、モジュールexample.com/m
の最も高いリリースバージョンまたはプレリリースバージョンを表示します。retract
ディレクティブと非推奨はこのバージョンのgo.mod
ファイルから読み込まれます。-retracted
フラグはGo 1.16で追加されました。
テンプレート関数module
は、モジュールパスまたはクエリでなければならない単一の文字列引数を取り、指定されたモジュールをModule
構造体として返します。エラーが発生した場合、結果はError
フィールドがnull以外であるModule
構造体になります。
go mod download
使用方法
go mod download [-x] [-json] [-reuse=old.json] [modules]
例
$ go mod download
$ go mod download golang.org/x/mod@v0.2.0
go mod download
コマンドは、指定されたモジュールをモジュールキャッシュにダウンロードします。引数は、メインモジュールの依存関係を選択するモジュールパスまたはモジュールパターン、またはpath@version
形式のバージョン問い合わせです。引数を指定しないと、download
はメインモジュールのすべての依存関係に適用されます。
go
コマンドは、通常の操作中に必要に応じて自動的にモジュールをダウンロードします。go mod download
コマンドは、主にモジュールキャッシュを事前に埋めたり、モジュールプロキシによって提供されるデータをロードするために役立ちます。
デフォルトでは、download
は標準出力に何も書き込みません。進行状況メッセージとエラーは標準エラーに出力されます。
-json
フラグにより、download
は標準出力にJSONオブジェクトのシーケンスを出力し、ダウンロードされた各モジュール(またはエラー)を記述します。これは、このGo構造体に相当します。
type Module struct {
Path string // module path
Query string // version query corresponding to this version
Version string // module version
Error string // error loading module
Info string // absolute path to cached .info file
GoMod string // absolute path to cached .mod file
Zip string // absolute path to cached .zip file
Dir string // absolute path to cached source root directory
Sum string // checksum for path, version (as in go.sum)
GoModSum string // checksum for go.mod (as in go.sum)
Origin any // provenance of module
Reuse bool // reuse of old module info is safe
}
-x
フラグにより、download
はdownload
が実行するコマンドを標準エラーに出力します。
-reuse
フラグは、以前の「go mod download -json」呼び出しのJSON出力を含むファイルの名前を受け入れます。goコマンドはこのファイルを使用して、モジュールが以前の呼び出し以降に変更されていないことを判断し、再ダウンロードを回避できます。再ダウンロードされないモジュールは、Reuseフィールドをtrueに設定することで、新しい出力でマークされます。通常、モジュールキャッシュはこの種の再利用を自動的に提供します。-reuse
フラグは、モジュールキャッシュを保持しないシステムで役立ちます。
go mod edit
使用方法
go mod edit [editing flags] [-fmt|-print|-json] [go.mod]
例
# Add a replace directive.
$ go mod edit -replace example.com/a@v1.0.0=./a
# Remove a replace directive.
$ go mod edit -dropreplace example.com/a@v1.0.0
# Set the go version, add a requirement, and print the file
# instead of writing it to disk.
$ go mod edit -go=1.14 -require=example.com/m@v1.0.0 -print
# Format the go.mod file.
$ go mod edit -fmt
# Format and print a different .mod file.
$ go mod edit -print tools.mod
# Print a JSON representation of the go.mod file.
$ go mod edit -json
go mod edit
コマンドは、主にツールやスクリプトで使用するために、go.mod
ファイルの編集とフォーマットのためのコマンドラインインターフェースを提供します。go mod edit
は1つのgo.mod
ファイルのみを読み取ります。他のモジュールに関する情報は参照しません。デフォルトでは、go mod edit
はメインモジュールのgo.mod
ファイルを読み書きしますが、編集フラグの後に異なるターゲットファイルを指定できます。
編集フラグは、一連の編集操作を指定します。
-module
フラグは、モジュールのパス(go.mod
ファイルのmodule行)を変更します。-go=version
フラグは、期待されるGo言語バージョンを設定します。-require=path@version
および-droprequire=path
フラグは、指定されたモジュールパスとバージョンに対する要件を追加および削除します。-require
はpath
に関する既存の要件を上書きすることに注意してください。これらのフラグは、主にモジュールグラフを理解しているツール向けです。ユーザーは、他のモジュールによって課せられた制約を満たすために必要なその他のgo.mod
調整を行うgo get path@version
またはgo get path@none
を優先する必要があります。go get
を参照してください。-exclude=path@version
および-dropexclude=path@version
フラグは、指定されたモジュールパスとバージョンに対する除外を追加および削除します。-exclude=path@version
はその除外が既に存在する場合は無効な操作であることに注意してください。-replace=old[@v]=new[@v]
フラグは、指定されたモジュールパスとバージョンペアの置換を追加します。old@v
の@v
を省略すると、左側にバージョンがない置換が追加され、古いモジュールパスのすべてのバージョンに適用されます。new@v
の@v
を省略すると、新しいパスはモジュールパスではなく、ローカルモジュールルートディレクトリでなければなりません。-replace
はold[@v]
に対する冗長な置換を上書きするため、@v
を省略すると特定のバージョンの置換が削除されます。-dropreplace=old[@v]
フラグは、指定されたモジュールパスとバージョンペアの置換を削除します。@v
が指定されている場合、指定されたバージョンの置換が削除されます。左側にバージョンがない既存の置換は、モジュールを置換する可能性があります。@v
を省略すると、バージョンがない置換が削除されます。-retract=version
および-dropretract=version
フラグは、指定されたバージョンに対するリトラクトを追加および削除します。これは、単一のバージョン(v1.2.3
など)またはインターバル([v1.1.0,v1.2.0]
など)です。-retract
フラグは、retract
ディレクティブの理由コメントを追加できないことに注意してください。理由コメントは推奨され、go list -m -u
などのコマンドで表示される場合があります。
編集フラグは複数回繰り返すことができます。変更は指定された順序で適用されます。
go mod edit
には、出力を制御する追加のフラグがあります。
-fmt
フラグは、他の変更を加えることなくgo.mod
ファイルを再フォーマットします。この再フォーマットは、go.mod
ファイルを使用または書き換える他の変更によっても暗黙的に実行されます。このフラグが必要な唯一のタイミングは、go mod edit -fmt
のように、他のフラグが指定されていない場合です。-print
フラグは、ディスクに書き戻す代わりに、最終的なgo.mod
をテキスト形式で出力します。-json
フラグは、テキスト形式でディスクに書き戻す代わりに、最終的なgo.mod
をJSON形式で出力します。JSON出力は、これらのGo型に対応しています。
type Module struct {
Path string
Version string
}
type GoMod struct {
Module ModPath
Go string
Require []Require
Exclude []Module
Replace []Replace
Retract []Retract
}
type ModPath struct {
Path string
Deprecated string
}
type Require struct {
Path string
Version string
Indirect bool
}
type Replace struct {
Old Module
New Module
}
type Retract struct {
Low string
High string
Rationale string
}
これは、間接的に参照される他のモジュールではなく、go.mod
ファイル自体のみを説明していることに注意してください。ビルドで使用できるモジュールの完全なセットについては、go list -m -json all
を使用してください。go list -m
を参照してください。
たとえば、ツールはgo mod edit -json
の出力を解析することでgo.mod
ファイルをデータ構造として取得し、-require
、-exclude
などを用いてgo mod edit
を呼び出すことで変更を加えることができます。
ツールは、golang.org/x/mod/modfile
パッケージを使用して、go.mod
ファイルの解析、編集、およびフォーマットを行うこともできます。
go mod graph
使用方法
go mod graph [-go=version]
go mod graph
コマンドは、モジュール要件グラフ(置換が適用されたもの)をテキスト形式で出力します。例:
example.com/main example.com/a@v1.1.0
example.com/main example.com/b@v1.2.0
example.com/a@v1.1.0 example.com/b@v1.1.1
example.com/a@v1.1.0 example.com/c@v1.3.0
example.com/b@v1.1.0 example.com/c@v1.1.0
example.com/b@v1.2.0 example.com/c@v1.2.0
モジュールグラフの各頂点は、モジュールの特定のバージョンを表します。グラフの各エッジは、依存関係の最小バージョンに対する要件を表します。
go mod graph
はグラフのエッジを1行ずつ出力します。各行には、スペースで区切られた2つのフィールドがあります。1つはモジュールバージョン、もう1つはモジュールの依存関係の1つです。各モジュールバージョンは、path@version
形式の文字列として識別されます。メインモジュールには@version
サフィックスがありません。バージョンがないためです。
-go
フラグを使用すると、go mod graph
は、go.mod
ファイルのgo
ディレクティブで示されたバージョンではなく、指定されたGoバージョンによってロードされたモジュールグラフを報告します。
バージョンの選択方法の詳細については、最小バージョン選択(MVS)を参照してください。go list -m
で選択されたバージョンを出力する方法、およびgo mod why
でモジュールが必要な理由を理解する方法についても参照してください。
go mod init
使用方法
go mod init [module-path]
例
go mod init
go mod init example.com/m
go mod init
コマンドは、新しいgo.mod
ファイルを現在のディレクトリに初期化して書き込みます。これにより、現在のディレクトリにルートを持つ新しいモジュールが作成されます。go.mod
ファイルは既に存在してはなりません。
init
は、新しいモジュールのモジュールパスをオプションの引数として1つ受け付けます。モジュールパスの選択方法については、指示を参照してください。モジュールパスの引数が省略された場合、init
は.go
ファイルのインポートコメント、ベンダーツール設定ファイル、現在のディレクトリ(GOPATH
内にある場合)を使用してモジュールパスを推測しようとします。
ベンダーツールの設定ファイルが存在する場合、init
はそのファイルからモジュールの要件をインポートしようとします。init
は次の設定ファイルに対応しています。
GLOCKFILE
(Glock)Godeps/Godeps.json
(Godeps)Gopkg.lock
(dep)dependencies.tsv
(godeps)glide.lock
(glide)vendor.conf
(trash)vendor.yml
(govend)vendor/manifest
(gvt)vendor/vendor.json
(govendor)
ベンダーツール設定ファイルは、常に完璧な忠実度で変換できるとは限りません。たとえば、同じリポジトリ内の複数のパッケージが異なるバージョンでインポートされ、リポジトリにモジュールが1つだけ含まれている場合、インポートされたgo.mod
はモジュールを1つのバージョンでのみ要求できます。go list -m all
を実行してビルドリストのすべてのバージョンを確認し、go mod tidy
を実行して不足している要件を追加し、不要な要件を削除することをお勧めします。
go mod tidy
使用方法
go mod tidy [-e] [-v] [-go=version] [-compat=version]
go mod tidy
は、go.mod
ファイルがモジュールのソースコードと一致することを確認します。現在のモジュールのパッケージと依存関係をビルドするために必要なモジュール要件を追加し、関連するパッケージを提供しないモジュールへの要件を削除します。また、go.sum
に不足しているエントリを追加し、不要なエントリを削除します。
-e
フラグ(Go 1.16で追加)を使用すると、パッケージの読み込み中に発生したエラーにもかかわらず、go mod tidy
が続行しようとします。
-v
フラグを使用すると、go mod tidy
は削除されたモジュールに関する情報を標準エラーに出力します。
go mod tidy
は、メインモジュール内のすべてのパッケージとそのパッケージが再帰的にインポートするすべてのパッケージを読み込むことによって機能します。これには、テストによってインポートされたパッケージ(他のモジュール内のテストを含む)も含まれます。go mod tidy
は、すべてのビルドタグが有効になっているかのように動作するため、プラットフォーム固有のソースファイルやカスタムビルドタグを必要とするファイルも考慮します(通常はこれらのソースファイルがビルドされない場合でも)。ただし、例外が1つあります。ignore
ビルドタグは無効になっているため、ビルド制約// +build ignore
を持つファイルは考慮されません。go mod tidy
は、他のパッケージによって明示的にインポートされていない限り、testdata
という名前のディレクトリ内にあるパッケージ、または名前が.
または_
で始まるパッケージをメインモジュールで考慮しません。
go mod tidy
がこのパッケージのセットを読み込んだ後、1つ以上のパッケージを提供する各モジュールに、メインモジュールのgo.mod
ファイルにrequire
ディレクティブがあることを確認します(メインモジュールがgo 1.16
以下である場合)または、別の必要なモジュールによって必要とされます。go mod tidy
は、不足している各モジュールの最新バージョンへの要件を追加します(latest
バージョンの定義については、バージョン照会を参照してください)。go mod tidy
は、上記で説明したセットにパッケージを提供しないモジュールのrequire
ディレクティブを削除します。
go mod tidy
は、require
ディレクティブの// indirect
コメントを追加または削除する場合もあります。// indirect
コメントは、メインモジュールのpackageによってインポートされていないパッケージを提供するモジュールを示します。(// indirect
依存関係とコメントが追加されるタイミングの詳細については、require
ディレクティブを参照してください。)
-go
フラグが設定されている場合、go mod tidy
はgo
ディレクティブを指定されたバージョンに更新し、そのバージョンに従ってモジュールグラフのプルーニングと遅延モジュール読み込みを有効または無効にし(必要に応じて間接的な要件を追加または削除します)。
デフォルトでは、go mod tidy
は、モジュールグラフがgo
ディレクティブに示されているバージョンに先行するGoバージョンによってロードされた場合、モジュールの選択されたバージョンが変更されないことを確認します。互換性のためにチェックされるバージョンは、-compat
フラグを使用して明示的に指定することもできます。
go mod vendor
使用方法
go mod vendor [-e] [-v] [-o]
go mod vendor
コマンドは、メインモジュールのルートディレクトリにvendor
という名前のディレクトリを作成します。このディレクトリには、メインモジュールのpackageのビルドとテストをサポートするために必要なすべてのパッケージのコピーが含まれています。メインモジュール外のpackageのテストによってのみインポートされるpackageは含まれません。go mod tidy
や他のモジュールコマンドと同様に、ignore
を除くビルド制約は、vendor
ディレクトリを作成する際には考慮されません。
ベンダー機能が有効になっている場合、go
コマンドは、モジュールキャッシュにモジュールをソースからダウンロードしてダウンロードされたコピーのパッケージを使用する代わりに、vendor
ディレクトリからパッケージを読み込みます。詳細については、ベンダー機能を参照してください。
go mod vendor
は、ベンダーされたパッケージと、それらがコピーされたモジュールバージョンの一覧を含むvendor/modules.txt
ファイルも作成します。ベンダー機能が有効になっている場合、このマニフェストは、go list -m
およびgo version -m
によって報告されるモジュールバージョンの情報ソースとして使用されます。go
コマンドがvendor/modules.txt
を読み取ると、モジュールバージョンがgo.mod
と一致していることを確認します。vendor/modules.txt
が生成されてからgo.mod
が変更された場合、go mod vendor
を再度実行する必要があります。
go mod vendor
は、存在するvendor
ディレクトリを削除してから再構築することに注意してください。ベンダーされたpackageにはローカル変更を加えてはいけません。go
コマンドは、vendor
ディレクトリ内のpackageが変更されていないことを確認しませんが、go mod vendor
を実行して変更が加えられていないことを確認することで、vendor
ディレクトリの整合性を検証できます。
-e
フラグ(Go 1.16で追加)を使用すると、パッケージの読み込み中に発生したエラーにもかかわらず、go mod vendor
が続行しようとします。
-v
フラグを使用すると、go mod vendor
はベンダーされたモジュールとパッケージの名前を標準エラーに出力します。
-o
フラグ(Go 1.18で追加)を使用すると、go mod vendor
は、vendor
の代わりに指定されたディレクトリにベンダーツリーを出力します。引数は、絶対パスまたはモジュールルートに対する相対パスのいずれかになります。
go mod verify
使用方法
go mod verify
go mod verify
は、モジュールキャッシュに格納されているメインモジュールの依存関係がダウンロード以降変更されていないことを確認します。このチェックを実行するために、go mod verify
はダウンロードされた各モジュールの.zip
ファイルと抽出されたディレクトリをハッシュ化し、それらのハッシュをモジュールが最初にダウンロードされたときに記録されたハッシュと比較します。go mod verify
は、ビルドリスト(go list -m all
で出力できます)の各モジュールをチェックします。
すべてのモジュールが変更されていない場合、go mod verify
は「すべてのモジュールが検証されました」と出力します。そうでない場合は、変更されたモジュールを報告し、ゼロ以外のステータスで終了します。
すべてのモジュール認識コマンドは、メインモジュールのgo.sum
ファイルのハッシュが、モジュールキャッシュにダウンロードされたモジュールに対して記録されたハッシュと一致することを確認することに注意してください。ハッシュがgo.sum
にない場合(たとえば、モジュールが初めて使用されるため)、go
コマンドはチェックサムデータベースを使用してそのハッシュを検証します(モジュールパスがGOPRIVATE
またはGONOSUMDB
と一致する場合を除く)。詳細については、モジュールの認証を参照してください。
対照的に、go mod verify
は、モジュールの.zip
ファイルとその抽出されたディレクトリが、最初にダウンロードされたときにモジュールキャッシュに記録されたハッシュと一致するハッシュを持っていることを確認します。これは、モジュールがダウンロードおよび検証された後にモジュールキャッシュ内のファイルの変更を検出するために役立ちます。go mod verify
は、キャッシュにないモジュールのコンテンツをダウンロードせず、モジュールコンテンツの検証にgo.sum
ファイルを使用しません。ただし、go mod verify
は最小バージョン選択を実行するためにgo.mod
ファイルをダウンロードする場合があります。go.sum
を使用してこれらのファイルを検証し、不足しているハッシュのgo.sum
エントリを追加する場合があります。
go mod why
使用方法
go mod why [-m] [-vendor] packages...
go mod why
は、メインモジュールからリストされたパッケージまでのインポートグラフ内の最短パスを表示します。
出力は、空白行で区切られた、コマンドラインで指定された各パッケージまたはモジュールに対するスタンザのシーケンスです。各スタンザは、ターゲットパッケージまたはモジュールを示す#
で始まるコメント行で始まります。後続の行には、インポートグラフを通るパスが1パッケージずつ表示されます。パッケージまたはモジュールがメインモジュールから参照されていない場合、スタンザには、その事実を示す単一の括弧付きの注記が表示されます。
例:
$ go mod why golang.org/x/text/language golang.org/x/text/encoding
# golang.org/x/text/language
rsc.io/quote
rsc.io/sampler
golang.org/x/text/language
# golang.org/x/text/encoding
(main module does not need package golang.org/x/text/encoding)
-m
フラグを使用すると、go mod why
は引数をモジュールのリストとして扱います。go mod why
は、各モジュールの任意のパッケージへのパスを出力します。-m
が使用されている場合でも、go mod why
はgo mod graph
によって出力されるモジュールグラフではなく、パッケージグラフを照会することに注意してください。
-vendor
フラグを使用すると、go mod why
はメインモジュール外のpackageのテストのインポートを無視します(go mod vendor
と同様です)。デフォルトでは、go mod why
はall
パターンと一致するpackageのグラフを考慮します。このフラグは、go 1.16
以降を宣言するモジュール(go.mod
のgo
ディレクティブを使用)ではGo 1.16以降では効果がありません。これは、all
の意味がgo mod vendor
によって一致するパッケージのセットと一致するように変更されたためです。
go version -m
使用方法
go version [-m] [-v] [file ...]
例
# Print Go version used to build go.
$ go version
# Print Go version used to build a specific executable.
$ go version ~/go/bin/gopls
# Print Go version and module versions used to build a specific executable.
$ go version -m ~/go/bin/gopls
# Print Go version and module versions used to build executables in a directory.
$ go version -m ~/go/bin/
go version
は、コマンドラインで指定された各実行ファイルのビルドに使用された Go のバージョンを報告します。
コマンドラインでファイルが指定されていない場合、go version
は自身のバージョン情報を表示します。
ディレクトリが指定された場合、go version
はそのディレクトリを再帰的に走査し、認識された Go バイナリを探してそのバージョンを報告します。デフォルトでは、go version
はディレクトリのスキャン中に検出された認識されないファイルは報告しません。-v
フラグを指定すると、認識されないファイルも報告されます。
-m
フラグを指定すると、go version
は、利用可能な場合、各実行ファイルに埋め込まれたモジュールのバージョン情報を表示します。各実行ファイルに対して、go version -m
は下記のようなタブ区切りの列を持つ表を出力します。
$ go version -m ~/go/bin/goimports
/home/jrgopher/go/bin/goimports: go1.14.3
path golang.org/x/tools/cmd/goimports
mod golang.org/x/tools v0.0.0-20200518203908-8018eb2c26ba h1:0Lcy64USfQQL6GAJma8BdHCgeofcchQj+Z7j0SXYAzU=
dep golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
dep golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
表の形式は将来変更される可能性があります。同じ情報は、runtime/debug.ReadBuildInfo
から取得できます。
表の各行の意味は、最初の列の単語によって決まります。
path
: 実行ファイルのビルドに使用されたmain
パッケージのパス。mod
:main
パッケージを含むモジュール。列はそれぞれ、モジュールパス、バージョン、およびsumです。メインモジュールのバージョンは(devel)
で、sumはありません。dep
: 実行ファイルにリンクされた1つ以上のパッケージを提供したモジュール。mod
と同じ形式です。=>
: 前の行のモジュールの置換。置換がローカルディレクトリの場合、ディレクトリパスのみが表示されます(バージョンまたはsumはありません)。置換がモジュールバージョンの場合、mod
およびdep
と同様に、パス、バージョン、およびsumが表示されます。置換されたモジュールにはsumがありません。
go clean -modcache
使用方法
go clean [-modcache]
-modcache
フラグは、go clean
により、バージョン管理された依存関係の展開されたソースコードを含む、モジュールキャッシュ全体を削除させます。
これは通常、モジュールキャッシュを削除する最適な方法です。デフォルトでは、モジュールキャッシュ内のほとんどのファイルとディレクトリは、テストやエディタが認証された後に意図せずファイルを変更することを防ぐために、読み取り専用になっています。残念ながら、これにより、親ディレクトリを書き込み可能にする前にファイルが削除できないため、rm -r
などのコマンドが失敗します。
-modcacherw
フラグ(go build
およびその他のモジュール認識コマンドで受け入れられます)は、モジュールキャッシュ内の新しいディレクトリを書き込み可能にします。すべてのモジュール認識コマンドに-modcacherw
を渡すには、GOFLAGS
変数に追加します。GOFLAGS
は、環境変数またはgo env -w
で設定できます。例えば、下記のコマンドはそれを永続的に設定します。
go env -w GOFLAGS=-modcacherw
-modcacherw
は注意して使用する必要があります。開発者は、モジュールキャッシュ内のファイルを変更しないように注意する必要があります。go mod verify
を使用して、キャッシュ内のファイルがメインモジュールのgo.sum
ファイルのハッシュと一致することを確認できます。
バージョン照会
いくつかのコマンドでは、コマンドラインのモジュールまたはパッケージパスの後に続く@
文字の後に表示される、バージョン照会を使用してモジュールのバージョンを指定できます。
例
go get example.com/m@latest
go mod download example.com/m@master
go list -m -json example.com/m@e3702bed2
バージョン照会は、次のいずれかになります。
- 特定のバージョンを選択する、
v1.2.3
などの完全に指定されたセマンティックバージョン。構文についてはバージョンを参照してください。 v1
またはv1.2
などのセマンティックバージョンプレフィックス。これにより、そのプレフィックスを持つ利用可能な最高バージョンが選択されます。<v1.2.3
または>=v1.5.6
などのセマンティックバージョン比較。これにより、比較対象のターゲットに最も近い利用可能なバージョンが選択されます(>
と>=
の場合は最低バージョン、<
と<=
の場合は最高バージョン)。- コミットハッシュプレフィックス、リビジョンタグ、またはブランチ名など、基礎となるソースリポジトリのリビジョン識別子。リビジョンがセマンティックバージョンでタグ付けされている場合、この照会はそのバージョンを選択します。そうでない場合、この照会は基礎となるコミットの擬似バージョンを選択します。他のバージョン照会と一致する名前のブランチやタグは、この方法では選択できないことに注意してください。たとえば、照会
v2
は、v2
で始まる最新のバージョンを選択し、v2
という名前のブランチは選択しません。 - 利用可能な最高のリリースバージョンを選択する文字列
latest
。リリースバージョンがない場合、latest
は最高のプレリリースバージョンを選択します。タグ付きバージョンがない場合、latest
はリポジトリのデフォルトブランチの先端にあるコミットの擬似バージョンを選択します。 latest
に似ていますが、モジュールが現在latest
が選択するバージョン(たとえば、プレリリース)よりも高いバージョンで要求されている場合(例:プレリリース)、upgrade
は現在のバージョンを選択します。- 現在要求されているバージョンと同じメジャーバージョン番号とマイナーバージョン番号を持つ、利用可能な最新のバージョンを選択する文字列
patch
。バージョンが現在要求されていない場合、patch
はlatest
と同じです。Go 1.16以降、go get
はpatch
を使用する際に現在のバージョンを必要とします(ただし、-u=patch
フラグにはこの要件はありません)。
特定の名前付きバージョンまたはリビジョンに対する照会を除き、すべての照会はgo list -m -versions
(go list -m
を参照)によって報告された利用可能なバージョンを考慮します。このリストには、擬似バージョンではなく、タグ付きバージョンのみが含まれています。メインモジュールのgo.mod
ファイルのexclude
ディレクティブによって許可されていないモジュールバージョンは考慮されません。latest
バージョンの同じモジュールからのgo.mod
ファイルのretract
ディレクティブによって網羅されているバージョンも、go list -m
で-retracted
フラグが使用されている場合、およびretract
ディレクティブのロード時を除いて無視されます。
リリースバージョンはプレリリースバージョンよりも優先されます。たとえば、バージョンv1.2.2
とv1.2.3-pre
が利用可能な場合、latest
照会はv1.2.3-pre
の方が高いにもかかわらず、v1.2.2
を選択します。<v1.2.4
照会も、v1.2.3-pre
の方がv1.2.4
に近いにもかかわらず、v1.2.2
を選択します。リリースバージョンまたはプレリリースバージョンが利用できない場合、latest
、upgrade
、およびpatch
照会は、リポジトリのデフォルトブランチの先端にあるコミットの擬似バージョンを選択します。他の照会はエラーを報告します。
モジュール外のモジュールコマンド
モジュール認識Goコマンドは通常、作業ディレクトリまたは親ディレクトリにあるgo.mod
ファイルによって定義されたメインモジュールのコンテキストで実行されます。一部のコマンドはgo.mod
ファイルなしでモジュール認識モードで実行できますが、ほとんどのコマンドはgo.mod
ファイルが存在しない場合、動作が異なったり、エラーを報告したりします。
モジュール認識コマンドを参照して、モジュール認識モードの有効化と無効化に関する情報を確認してください。
コマンド | 動作 |
---|---|
go build go doc go fix go fmt go generate go install go list go run go test go vet
|
標準ライブラリのパッケージと、コマンドラインで.go ファイルとして指定されたパッケージのみをロード、インポート、およびビルドできます。他のモジュールからのパッケージは、モジュールの要件を記録して決定的なビルドを保証する場所がないため、ビルドできません。 |
go get |
パッケージと実行ファイルは通常どおりビルドしてインストールできます。go get がgo.mod ファイルなしで実行されるとメインモジュールが存在しないため、replace およびexclude ディレクティブは適用されないことに注意してください。 |
go list -m |
-versions フラグが使用されている場合を除き、ほとんどの引数には明示的なバージョン照会が必要です。 |
go mod download |
ほとんどの引数には明示的なバージョン照会が必要です。 |
go mod edit |
明示的なファイル引数が必要です。 |
go mod graph go mod tidy go mod vendor go mod verify go mod why
|
これらのコマンドにはgo.mod ファイルが必要であり、存在しない場合はエラーを報告します。 |
go work init
使用方法
go work init [moddirs]
init は、現在のディレクトリに新しい go.work ファイルを初期化して書き込み、現在のディレクトリに新しいワークスペースを作成します。
go work init は、ワークスペースモジュールのパスを引数としてオプションで受け入れます。引数を省略した場合、モジュールのない空のワークスペースが作成されます。
各引数パスは、go.work ファイルの use ディレクティブに追加されます。現在の go バージョンも go.work ファイルにリストされます。
go work edit
使用方法
go work edit [editing flags] [go.work]
go work edit
コマンドは、主にツールやスクリプトで使用するための、go.work
を編集するためのコマンドラインインターフェースを提供します。go.work
のみを読み込み、関係するモジュールに関する情報は参照しません。ファイルが指定されていない場合、Edit は現在のディレクトリとその親ディレクトリでgo.work
ファイルを探します。
編集フラグは、一連の編集操作を指定します。
-fmt
フラグは、他の変更を加えることなく、go.workファイルを再フォーマットします。この再フォーマットは、go.work
ファイルを使用または書き換える他の変更によっても暗黙的に行われます。このフラグが必要なのは、他のフラグが指定されていない場合、つまり「go work edit-fmt
」の場合のみです。-use=path
と-dropuse=path
フラグは、go.work
ファイルのモジュールディレクトリのセットからuseディレクティブを追加および削除します。-replace=old[@v]=new[@v]
フラグは、指定されたモジュールパスとバージョンペアの置換を追加します。old@v
の@v
を省略した場合、左側にバージョンがない置換が追加されます。これは、古いモジュールパスのすべてのバージョンに適用されます。new@v
の@v
を省略した場合、新しいパスはモジュールパスではなく、ローカルモジュールルートディレクトリである必要があります。-replace
はold[@v]
に対する冗長な置換を上書きするため、@v
を省略すると、特定のバージョンの既存の置換が削除されることに注意してください。-dropreplace=old[@v]
フラグは、指定されたモジュールパスとバージョンペアの置換を削除します。@v
を省略した場合、左側にバージョンがない置換が削除されます。-go=version
フラグは、期待されるGo言語バージョンを設定します。
編集フラグは複数回繰り返すことができます。変更は指定された順序で適用されます。
go work edit
には、出力を制御する追加のフラグがあります。
-print
フラグは、最終的なgo.workをテキスト形式で出力し、go.modに書き戻しません。-json
フラグは、最終的なgo.workファイルをJSON形式で出力し、go.modに書き戻しません。JSON出力は、これらのGo型に対応しています。
type Module struct {
Path string
Version string
}
type GoWork struct {
Go string
Directory []Directory
Replace []Replace
}
type Use struct {
Path string
ModulePath string
}
type Replace struct {
Old Module
New Module
}
go work use
使用方法
go work use [-r] [moddirs]
go work use
コマンドは、ディレクトリを(オプションで再帰的に)go.work
ファイルに追加するためのコマンドラインインターフェースを提供します。
コマンドラインにリストされている各引数ディレクトリに対して、go.work
ファイルにuse
ディレクティブが追加され、ディスク上に存在する場合はgo.work
ファイルに追加され、ディスク上に存在しない場合はgo.work
ファイルから削除されます。
-r
フラグは、引数ディレクトリ内でモジュールを再帰的に検索し、useコマンドは各ディレクトリが引数として指定されているかのように動作します。
go work sync
使用方法
go work sync
go work sync
コマンドは、ワークスペースのビルドリストをワークスペースのモジュールに同期します。
ワークスペースのビルドリストは、ワークスペースでビルドを実行するために使用されるすべての(推移的な)依存モジュールのバージョンのセットです。go work sync
は、最小バージョン選択(MVS)アルゴリズムを使用してそのビルドリストを生成し、それらのバージョンをワークスペース(use
ディレクティブ付き)で指定された各モジュールに同期します。
ワークスペースのビルドリストが計算されると、ワークスペース内の各モジュールのgo.mod
ファイルが書き換えられ、そのモジュールに関連する依存関係がワークスペースのビルドリストに一致するようにアップグレードされます。最小バージョン選択により、ビルドリストの各モジュールのバージョンは、常に各ワークスペースモジュール内のバージョンと同じかそれ以上であることが保証されます。
モジュールプロキシ
GOPROXY
プロトコル
モジュールプロキシは、下記に指定されたパスに対するGET
リクエストに応答できるHTTPサーバーです。リクエストにはクエリパラメータがなく、特定のヘッダーも必要ありません。そのため、固定ファイルシステム(file://
URLを含む)から提供するサイトでもモジュールプロキシになることができます。
成功したHTTPレスポンスのステータスコードは200(OK)でなければなりません。リダイレクト(3xx)は追従されます。ステータスコード4xxと5xxのレスポンスはエラーとして扱われます。エラーコード404(Not Found)と410(Gone)は、要求されたモジュールまたはバージョンがプロキシでは利用できないことを示しますが、他の場所で見つかる可能性があります。エラーレスポンスのコンテンツタイプはtext/plain
で、charset
はutf-8
またはus-ascii
のいずれかである必要があります。
go
コマンドは、プロキシまたはソース管理サーバーに接続するように、プロキシURLのリストを受け入れるGOPROXY
環境変数を使用して設定できます。環境変数の詳細については、リストにキーワードdirect
またはoff
を含めることができます。リストの要素はコンマ(,
)またはパイプ(|
)で区切ることができ、これによりエラーのフォールバック動作が決まります。URLの後にコンマが続く場合、go
コマンドは、404(Not Found)または410(Gone)レスポンスの後でのみ、後のソースにフォールバックします。URLの後にパイプが続く場合、go
コマンドは、タイムアウトなどの非HTTPエラーを含むあらゆるエラーの後で、後のソースにフォールバックします。このエラー処理動作により、プロキシは未知のモジュールのゲートキーパーとして機能できます。たとえば、プロキシは、承認されていないリストにないモジュールに対してエラー403(Forbidden)で応答できます(プライベートモジュールを提供するプライベートプロキシを参照)。
下の表は、モジュールプロキシが応答しなければならないクエリを指定しています。各パスについて、$base
はプロキシURLのパス部分、$module
はモジュールパス、$version
はバージョンです。たとえば、プロキシURLがhttps://example.com/mod
で、クライアントがバージョンv0.3.2
のモジュールgolang.org/x/text
のgo.mod
ファイルを要求している場合、クライアントはhttps://example.com/mod/golang.org/x/text/@v/v0.3.2.mod
に対するGET
リクエストを送信します。
大文字と小文字を区別しないファイルシステムから提供する場合のあいまいさを避けるため、$module
要素と$version
要素は大文字の文字を感嘆符とそれに対応する小文字の文字に置き換えることで、ケースエンコードされます。これにより、モジュールexample.com/M
とexample.com/m
の両方をディスクに保存できます(前者はexample.com/!m
としてエンコードされるため)。
パス | 説明 |
---|---|
$base/$module/@v/list |
指定されたモジュールの既知のバージョンの一覧をプレーンテキストで、1行に1つずつ返します。このリストには疑似バージョンを含めるべきではありません。 |
$base/$module/@v/$version.info |
モジュールの特定のバージョンのJSON形式のメタデータを返します。レスポンスは、以下のGoデータ構造に対応するJSONオブジェクトでなければなりません。 type Info struct { Version string // version string Time time.Time // commit time }
将来的にさらにフィールドが追加される可能性があるため、他の名前は予約されています。 |
$base/$module/@v/$version.mod |
モジュールの特定のバージョンのgo.mod ファイルを返します。モジュールが要求されたバージョンにgo.mod ファイルを持っていない場合、要求されたモジュールパスを持つmodule ステートメントのみを含むファイルが返される必要があります。それ以外の場合は、元の変更されていないgo.mod ファイルが返されます。 |
$base/$module/@v/$version.zip |
モジュールの特定のバージョンの内容を含むzipファイルを返します。このzipファイルのフォーマット方法については、モジュールzipファイルを参照してください。 |
$base/$module/@latest |
$base/$module/@v/$version.info と同じ形式で、モジュールの最新の既知のバージョンのJSON形式のメタデータを返します。最新のバージョンは、$base/$module/@v/list が空の場合、またはリストされたバージョンが適切でない場合に、go コマンドが使用する必要があるモジュールのバージョンである必要があります。このエンドポイントはオプションであり、モジュールプロキシはこれを実装する必要はありません。 |
モジュールの最新バージョンを解決する場合、go
コマンドはまず$base/$module/@v/list
を要求し、適切なバージョンが見つからない場合は、$base/$module/@latest
を要求します。go
コマンドは、意味的に最も高いリリースバージョン、意味的に最も高いプリリリースバージョン、そして時系列的に最も新しい疑似バージョンの順に優先します。Go 1.12以前では、go
コマンドは$base/$module/@v/list
内の疑似バージョンをプリリリースバージョンと見なしていましたが、Go 1.13以降はそうではなくなりました。
モジュールプロキシは、$base/$module/$version.mod
および$base/$module/$version.zip
クエリに対する成功したレスポンスに対して、常に同じコンテンツを提供する必要があります。このコンテンツは、go.sum
ファイルと、デフォルトではチェックサムデータベースを使用して暗号化的に認証されます。
go
コマンドは、モジュールプロキシからダウンロードしたほとんどのコンテンツを、$GOPATH/pkg/mod/cache/download
にあるモジュールキャッシュにキャッシュします。バージョン管理システムから直接ダウンロードする場合でも、go
コマンドは明示的なinfo
、mod
、zip
ファイルを合成し、プロキシから直接ダウンロードした場合と同様にこのディレクトリに保存します。キャッシュのレイアウトはプロキシURL空間と同じなので、$GOPATH/pkg/mod/cache/download
をhttps://example.com/proxy
で提供する(またはそこにコピーする)ことで、ユーザーはGOPROXY
をhttps://example.com/proxy
に設定することで、キャッシュされたモジュールバージョンにアクセスできます。
プロキシとの通信
go
コマンドは、モジュールプロキシからモジュールソースコードとメタデータをダウンロードできます。環境変数のGOPROXY
を使用して、go
コマンドが接続できるプロキシと、バージョン管理システムと直接通信できるかどうかを設定できます。ダウンロードされたモジュールデータはモジュールキャッシュに保存されます。go
コマンドは、キャッシュにない情報が必要な場合にのみプロキシに接続します。
GOPROXY
プロトコルセクションでは、GOPROXY
サーバーに送信できるリクエストについて説明しています。しかし、go
コマンドがいつこれらのリクエストを行うのかを理解することも役立ちます。たとえば、go build
は次の手順に従います。
go.mod
ファイルを読み取り、最小バージョン選択(MVS)を実行することにより、ビルドリストを計算します。- コマンドラインで指定されたパッケージとそのパッケージがインポートするパッケージを読み取ります。
- パッケージがビルドリストのどのモジュールからも提供されていない場合、そのパッケージを提供するモジュールを見つけます。その最新バージョンのモジュール要件を
go.mod
に追加し、最初からやり直します。 - すべてがロードされた後、パッケージをビルドします。
go
コマンドがビルドリストを計算すると、モジュールグラフ内の各モジュールのgo.mod
ファイルを読み込みます。go.mod
ファイルがキャッシュにない場合、go
コマンドは$module/@v/$version.mod
リクエスト($module
はモジュールパス、$version
はバージョン)を使用してプロキシからダウンロードします。これらのリクエストは、curl
などのツールでテストできます。たとえば、以下のコマンドは、バージョンv0.2.0
のgolang.org/x/mod
のgo.mod
ファイルをダウンロードします。
$ curl https://proxy.golang.org/golang.org/x/mod/@v/v0.2.0.mod
module golang.org/x/mod
go 1.12
require (
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898
)
パッケージをロードするために、go
コマンドは、それを提供するモジュールのソースコードを必要とします。モジュールソースコードは.zip
ファイルで配布され、モジュールキャッシュに展開されます。モジュールの.zip
がキャッシュにない場合、go
コマンドは$module/@v/$version.zip
リクエストを使用してダウンロードします。
$ curl -O https://proxy.golang.org/golang.org/x/mod/@v/v0.2.0.zip
$ unzip -l v0.2.0.zip | head
Archive: v0.2.0.zip
Length Date Time Name
--------- ---------- ----- ----
1479 00-00-1980 00:00 golang.org/x/mod@v0.2.0/LICENSE
1303 00-00-1980 00:00 golang.org/x/mod@v0.2.0/PATENTS
559 00-00-1980 00:00 golang.org/x/mod@v0.2.0/README
21 00-00-1980 00:00 golang.org/x/mod@v0.2.0/codereview.cfg
214 00-00-1980 00:00 golang.org/x/mod@v0.2.0/go.mod
1476 00-00-1980 00:00 golang.org/x/mod@v0.2.0/go.sum
5224 00-00-1980 00:00 golang.org/x/mod@v0.2.0/gosumcheck/main.go
go.mod
ファイルは通常.zip
ファイルに含まれていますが、.mod
リクエストと.zip
リクエストは別々であることに注意してください。go
コマンドは、多くの異なるモジュールのgo.mod
ファイルをダウンロードする必要がある場合があり、.mod
ファイルは.zip
ファイルよりもはるかに小さいです。さらに、Goプロジェクトにgo.mod
ファイルがない場合、プロキシはmodule
ディレクティブのみを含む合成go.mod
ファイルを返します。合成go.mod
ファイルは、バージョン管理システムからダウンロードするときにgo
コマンドによって生成されます。
go
コマンドがビルドリストのどのモジュールからも提供されていないパッケージをロードする必要がある場合、それを提供する新しいモジュールを見つけようとします。パッケージをモジュールに解決するセクションでは、このプロセスについて説明しています。要約すると、go
コマンドは、パッケージを含みうる可能性のある各モジュールパスの最新バージョンの情報を要求します。たとえば、パッケージgolang.org/x/net/html
の場合、go
コマンドはモジュールgolang.org/x/net/html
、golang.org/x/net
、golang.org/x/
、golang.org
の最新バージョンを見つけようとします。実際にはgolang.org/x/net
のみが存在し、そのパッケージを提供するため、go
コマンドはそのモジュールの最新バージョンを使用します。複数のモジュールがパッケージを提供する場合、go
コマンドはパスが最も長いモジュールを使用します。
go
コマンドがモジュールの最新バージョンを要求する場合、最初に$module/@v/list
のリクエストを送信します。リストが空の場合、または返されたバージョンのいずれも使用できない場合、$module/@latest
のリクエストを送信します。バージョンが選択されると、go
コマンドはメタデータの$module/@v/$version.info
リクエストを送信します。その後、$module/@v/$version.mod
および$module/@v/$version.zip
リクエストを送信して、go.mod
ファイルとソースコードをロードする場合があります。
$ curl https://proxy.golang.org/golang.org/x/mod/@v/list
v0.1.0
v0.2.0
$ curl https://proxy.golang.org/golang.org/x/mod/@v/v0.2.0.info
{"Version":"v0.2.0","Time":"2020-01-02T17:33:45Z"}
.mod
または.zip
ファイルをダウンロードした後、go
コマンドは暗号化ハッシュを計算し、それがメインモジュールのgo.sum
ファイルのハッシュと一致するかどうかを確認します。ハッシュがgo.sum
に存在しない場合、デフォルトでは、go
コマンドはチェックサムデータベースから取得します。計算されたハッシュが一致しない場合、go
コマンドはセキュリティエラーを報告し、ファイルをモジュールキャッシュにインストールしません。GOPRIVATE
およびGONOSUMDB
環境変数を使用して、特定のモジュールのチェックサムデータベースへのリクエストを無効にすることができます。GOSUMDB
環境変数をoff
に設定して、チェックサムデータベースへのリクエストを完全に無効にすることもできます。モジュールの認証の詳細を参照してください。.info
リクエストで返されるバージョンリストとバージョンメタデータは認証されず、時間の経過とともに変更される可能性があることに注意してください。
プロキシからモジュールを直接提供する
ほとんどのモジュールは、バージョン管理リポジトリから開発および提供されます。ダイレクトモードでは、go
コマンドはバージョン管理ツールを使用してそのようなモジュールをダウンロードします(バージョン管理システムを参照)。モジュールプロキシからモジュールを直接提供することも可能です。これは、バージョン管理サーバーを公開せずにモジュールを提供したい組織や、go
コマンドがサポートしていないバージョン管理ツールを使用している組織にとって役立ちます。
go
コマンドがダイレクトモードでモジュールをダウンロードする場合、まずモジュールパスに基づいてHTTP GETリクエストでモジュールサーバーのURLを検索します。HTMLレスポンス内で、名前が<meta>
で、`go-import`であるタグを探します。このタグの内容には、リポジトリルートパス、バージョン管理システム、およびURLがスペースで区切られて含まれている必要があります。詳細はモジュールパスのリポジトリの検索を参照してください。
バージョン管理システムがmod
の場合、go
コマンドはGOPROXY
プロトコルを使用して指定されたURLからモジュールをダウンロードします。
たとえば、go
コマンドがバージョンv1.0.0
でモジュールexample.com/gopher
をダウンロードしようとしているとします。この場合、https://example.com/gopher?go-get=1
にリクエストを送信します。サーバーは、次のタグを含むHTMLドキュメントで応答します。
<meta name="go-import" content="example.com/gopher mod https://modproxy.example.com">
このレスポンスに基づいて、go
コマンドはhttps://modproxy.example.com/example.com/gopher/@v/v1.0.0.info
、v1.0.0.mod
、v1.0.0.zip
のリクエストを送信してモジュールをダウンロードします。
プロキシから直接提供されるモジュールは、GOPATHモードでgo get
を使用してダウンロードできないことに注意してください。
バージョン管理システム
go
コマンドは、バージョン管理リポジトリからモジュールのソースコードとメタデータを直接ダウンロードする場合があります。プロキシからモジュールをダウンロードする方が通常は高速ですが、プロキシが使用できない場合、またはモジュールのリポジトリがプロキシからアクセスできない場合(プライベートリポジトリではよくあること)、リポジトリに直接接続する必要があります。Git、Subversion、Mercurial、Bazaar、Fossilがサポートされています。go
コマンドで使用するには、バージョン管理ツールをPATH
内のディレクトリにインストールする必要があります。
プロキシではなくソースリポジトリから特定のモジュールをダウンロードするには、GOPRIVATE
またはGONOPROXY
環境変数を設定します。すべてのモジュールをソースリポジトリから直接ダウンロードするようにgo
コマンドを構成するには、GOPROXY
をdirect
に設定します。詳細については、環境変数を参照してください。
モジュールパスのリポジトリの検索
go
コマンドがdirect
モードでモジュールをダウンロードする場合、最初にモジュールを含むリポジトリの場所を特定します。
モジュールパスがパスコンポーネントの最後にVCS修飾子(.bzr
、.fossil
、.git
、.hg
、.svn
のいずれか)を持つ場合、go
コマンドは、そのパス修飾子までの部分をリポジトリURLとして使用します。たとえば、モジュールexample.com/foo.git/bar
の場合、go
コマンドはexample.com/foo.git
のリポジトリをgitを使用してダウンロードし、bar
サブディレクトリにモジュールがあると想定します。go
コマンドは、バージョン管理ツールのサポートするプロトコルに基づいて使用するプロトコルを推測します。
モジュールパスに修飾子がない場合、go
コマンドは、?go-get=1
クエリ文字列を使用してモジュールパスから導出されたURLにHTTP GET
リクエストを送信します。たとえば、モジュールgolang.org/x/mod
の場合、go
コマンドは次のリクエストを送信する場合があります。
https://go.dokyumento.jp/x/mod?go-get=1 (preferred)
https://go.dokyumento.jp/x/mod?go-get=1 (fallback, only with GOINSECURE)
go
コマンドはリダイレクトに従いますが、それ以外のレスポンスステータスコードは無視するため、サーバーは404またはその他のエラーステータスで応答する場合があります。GOINSECURE
環境変数を設定して、特定のモジュールに対して暗号化されていないHTTPへのフォールバックとリダイレクトを許可できます。
サーバーは、ドキュメントの<head>
内に<meta>
タグを含むHTMLドキュメントで応答する必要があります。go
コマンドの制限されたパーサーを混乱させないために、<meta>
タグはドキュメントの先頭に表示する必要があります。特に、生のJavaScriptやCSSの前に表示する必要があります。<meta>
タグは次の形式である必要があります。
<meta name="go-import" content="root-path vcs repo-url">
root-path
はリポジトリルートパスであり、リポジトリのルートディレクトリに対応するモジュールパスの部分です。リクエストされたモジュールパスのプレフィックスまたは完全一致である必要があります。完全一致でない場合、プレフィックスに対して別のリクエストが行われ、<meta>
タグの一致が検証されます。
vcs
はバージョン管理システムです。これは、以下の表にリストされているツールのいずれか、またはキーワードmod
である必要があります。mod
は、GOPROXY
プロトコルを使用して指定されたURLからモジュールをダウンロードするようにgo
コマンドに指示します。詳細はプロキシからモジュールを直接提供するを参照してください。
repo-url
はリポジトリのURLです。URLにスキームが含まれていない場合(モジュールパスにVCS修飾子があるため、または<meta>
タグにスキームがないため)、go
コマンドはバージョン管理システムでサポートされている各プロトコルを試行します。たとえば、Gitの場合、go
コマンドはhttps://
を試してからgit+ssh://
を試します。安全でないプロトコル(http://
やgit://
など)は、モジュールパスがGOINSECURE
環境変数によって一致する場合にのみ使用できます。
名前 | コマンド | GOVCSデフォルト | セキュアなスキーム |
---|---|---|---|
Bazaar | bzr |
プライベートのみ | https 、bzr+ssh |
Fossil | fossil |
プライベートのみ | https |
Git | git |
パブリックとプライベート | https 、git+ssh 、ssh |
Mercurial | hg |
パブリックとプライベート | https 、ssh |
Subversion | svn |
プライベートのみ | https 、svn+ssh |
例として、もう一度golang.org/x/mod
を考えてみましょう。go
コマンドはhttps://go.dokyumento.jp/x/mod?go-get=1
にリクエストを送信します。サーバーは、次のタグを含むHTMLドキュメントで応答します。
<meta name="go-import" content="golang.org/x/mod git https://go.googlesource.com/mod">
このレスポンスから、go
コマンドはリモートURLhttps://go.googlesource.com/mod
にあるGitリポジトリを使用します。
GitHubやその他の一般的なホスティングサービスは、すべてのリポジトリの?go-get=1
クエリに応答するため、通常、これらのサイトでホストされているモジュールにはサーバー構成は必要ありません。
リポジトリURLが見つかった後、go
コマンドはリポジトリをモジュールキャッシュにクローンします。一般的に、go
コマンドはリポジトリから不要なデータのフェッチを避けるように試みます。ただし、使用される実際のコマンドはバージョン管理システムによって異なり、時間の経過とともに変更される可能性があります。Gitの場合、go
コマンドはコミットをダウンロードせずに利用可能なほとんどのバージョンをリストできます。通常は祖先コミットをダウンロードせずにコミットをフェッチしますが、場合によっては必要になることもあります。
バージョンとコミットのマッピング
go
コマンドは、v1.2.3
、v2.4.0-beta
、v3.0.0+incompatible
など、特定の標準バージョンでリポジトリ内のモジュールをチェックアウトする場合があります。各モジュールバージョンには、どのリビジョンをチェックアウトするべきかを示すリポジトリ内にセマンティックバージョンのタグが必要です。
モジュールがリポジトリのルートディレクトリまたはルートディレクトリのメジャーバージョンサブディレクトリで定義されている場合、各バージョンのタグ名は対応するバージョンと同じになります。たとえば、モジュールgolang.org/x/text
はリポジトリのルートディレクトリで定義されているため、バージョンv0.3.2
にはそのリポジトリにv0.3.2
というタグがあります。これはほとんどのモジュールに当てはまります。
モジュールがリポジトリ内のサブディレクトリで定義されている場合、つまり、モジュールパスのモジュールサブディレクトリ部分が空でない場合、各タグ名にはモジュールサブディレクトリをプレフィックスとして付けて、スラッシュを付ける必要があります。たとえば、モジュールgolang.org/x/tools/gopls
は、ルートパスgolang.org/x/tools
のリポジトリのgopls
サブディレクトリで定義されています。そのモジュールのバージョンv0.4.0
には、そのリポジトリにgopls/v0.4.0
という名前のタグが必要です。
セマンティックバージョンのタグのメジャーバージョン番号は、モジュールパスのメジャーバージョンのサフィックス(存在する場合)と一致する必要があります。たとえば、タグv1.0.0
はモジュールexample.com/mod
に属する可能性がありますが、タグv2.0.0
を持つexample.com/mod/v2
には属しません。
go.mod
ファイルが存在せず、モジュールがリポジトリのルートディレクトリにある場合、メジャーバージョンv2
以上のタグは、メジャーバージョンのサフィックスがないモジュールに属する可能性があります。この種のバージョンは、サフィックス+incompatible
で示されます。バージョンのタグ自体にはサフィックスを含めるべきではありません。非モジュールリポジトリとの互換性を参照してください。
タグが作成された後、削除したり、別のリビジョンに変更したりすることはできません。バージョンは認証され、安全で再現性のあるビルドが保証されます。タグが変更された場合、クライアントはダウンロード時にセキュリティエラーが発生する可能性があります。タグが削除された後も、そのコンテンツはモジュールプロキシで使用可能な場合があります。
疑似バージョンとコミットのマッピング
go
コマンドは、v1.3.2-0.20191109021931-daa7c04131f5
などの疑似バージョンとしてエンコードされた特定のリビジョンでリポジトリ内のモジュールをチェックアウトする場合があります。
疑似バージョンの最後の12文字(上記の例ではdaa7c04131f5
)は、チェックアウトするリポジトリのリビジョンを示しています。その意味はバージョン管理システムによって異なります。GitとMercurialでは、これはコミットハッシュのプレフィックスです。Subversionでは、これはゼロパディングされたリビジョン番号です。
コミットをチェックアウトする前に、go
コマンドはタイムスタンプ(上記では20191109021931
)がコミット日と一致することを検証します。また、ベースバージョン(上記の例ではv1.3.1
、v1.3.2
の前バージョン)が、コミットの祖先であるセマンティックバージョンのタグに対応することを検証します。これらのチェックにより、モジュール作成者は、疑似バージョンが他のリリース済みバージョンとどのように比較されるかを完全に制御できます。
詳細については、疑似バージョンを参照してください。
ブランチとコミットのバージョンのマッピング
モジュールは、バージョン照会を使用して、特定のブランチ、タグ、またはリビジョンでチェックアウトできます。
go get example.com/mod@master
go
コマンドは、これらの名前を標準バージョンに変換します。これは最小バージョン選択(MVS)で使用できます。MVSは、バージョンを一意にソートできる機能に依存します。ブランチ名とリビジョンは、リポジトリの構造が変更される可能性があるため、時間の経過とともに確実に比較できません。
リビジョンがv1.2.3
などの1つ以上のセマンティックバージョンのタグでタグ付けされている場合、最も高い有効なバージョンのタグが使用されます。go
コマンドは、ターゲットモジュールに属する可能性のあるセマンティックバージョンのタグのみを考慮します。たとえば、タグv1.5.2
は、メジャーバージョンがモジュールパスのサフィックスと一致しないため、example.com/mod/v2
には考慮されません。
リビジョンが有効なセマンティックバージョンのタグでタグ付けされていない場合、go
コマンドは疑似バージョンを生成します。リビジョンに有効なセマンティックバージョンのタグを持つ祖先がある場合、最も高い祖先のバージョンが疑似バージョンのベースとして使用されます。疑似バージョンを参照してください。
リポジトリ内のモジュールディレクトリ
モジュールのリポジトリが特定のリビジョンでチェックアウトされると、go
コマンドはモジュールのgo.mod
ファイル(モジュールのルートディレクトリ)を含むディレクトリの場所を特定する必要があります。
モジュールパスは、リポジトリルートパス(リポジトリのルートディレクトリに対応)、モジュールサブディレクトリ、およびメジャーバージョンサフィックス(v2
以降のモジュールのみ)の3つの部分から構成されていることを思い出してください。
ほとんどのモジュールでは、モジュールパスはリポジトリルートパスと等しいため、モジュールのルートディレクトリはリポジトリのルートディレクトリになります。
モジュールは、リポジトリのサブディレクトリで定義されることがあります。これは通常、独立してリリースおよびバージョン管理する必要がある複数のコンポーネントを持つ大規模なリポジトリに対して行われます。このようなモジュールは、リポジトリルートパスの後にモジュールパスの部分が続くサブディレクトリにあることが期待されます。たとえば、モジュールexample.com/monorepo/foo/bar
がルートパスexample.com/monorepo
のリポジトリにあるとします。そのgo.mod
ファイルはfoo/bar
サブディレクトリに存在する必要があります。
モジュールがメジャーバージョンv2
以降でリリースされている場合、そのパスにはメジャーバージョンサフィックスが必要です。メジャーバージョンサフィックスを持つモジュールは、サフィックス付きのサブディレクトリとサフィックスなしのサブディレクトリのいずれかに定義できます。たとえば、上記のモジュールの新しいバージョンがパスexample.com/monorepo/foo/bar/v2
でリリースされたとします。そのgo.mod
ファイルはfoo/bar
またはfoo/bar/v2
のいずれかに存在する可能性があります。
メジャーバージョンサフィックスを持つサブディレクトリは、メジャーバージョンサブディレクトリです。これらは、単一のブランチでモジュールの複数のメジャーバージョンを開発するために使用できます。複数のメジャーバージョンの開発が別々のブランチで行われる場合は、不要になる可能性があります。ただし、メジャーバージョンサブディレクトリには重要な特性があります。GOPATH
モードでは、パッケージのインポートパスはGOPATH/src
の下のディレクトリと正確に一致します。go
コマンドはGOPATH
モードで最小限のモジュール互換性を提供します(非モジュールリポジトリとの互換性を参照)。そのため、GOPATH
モードでビルドされたプロジェクトとの互換性のために、メジャーバージョンサブディレクトリが常に必要というわけではありません。ただし、最小限のモジュール互換性をサポートしていない古いツールは問題が発生する可能性があります。
go
コマンドがモジュールのルートディレクトリを見つけると、ディレクトリのコンテンツの.zip
ファイルを作成し、その.zip
ファイルをモジュールキャッシュに展開します。.zip
ファイルに含めることができるファイルの詳細については、ファイルパスとサイズに関する制約を参照してください。.zip
ファイルのコンテンツは、.zip
ファイルがプロキシからダウンロードされた場合と同じ方法で、モジュールキャッシュへの展開前に認証されます。
モジュールのzipファイルには、vendor
ディレクトリの内容や入れ子になったモジュール(go.mod
ファイルを含むサブディレクトリ)の内容は含まれません。つまり、モジュールは、そのディレクトリ外または他のモジュールにあるファイルを参照しないように注意する必要があります。たとえば、//go:embed
パターンは、入れ子になったモジュール内のファイルと一致してはなりません。この動作は、ファイルがモジュールに含まれるべきでない状況における便利な回避策として機能する場合があります。たとえば、リポジトリにtestdata
ディレクトリにチェックインされた大きなファイルがある場合、モジュール作成者はtestdata
に空のgo.mod
ファイルを追加することで、ユーザーがこれらのファイルをダウンロードする必要がなくなります。もちろん、これにより、依存関係をテストするユーザーの範囲が狭くなる可能性があります。
LICENSEファイルの特別なケース
go
コマンドがリポジトリのルートディレクトリにないモジュールの.zip
ファイルを作成する場合、モジュールにルートディレクトリ(go.mod
と並んで)にLICENSE
という名前のファイルがない場合、go
コマンドは同じリビジョンに存在する場合はリポジトリのルートディレクトリからLICENSE
という名前のファイルをコピーします。
この特別なケースにより、同じLICENSE
ファイルをリポジトリ内のすべてのモジュールに適用できます。これは、.txt
などの拡張子なしのLICENSE
という名前のファイルのみに適用されます。残念ながら、既存のモジュールの暗号化された合計を壊すことなく拡張することはできません。モジュールの認証を参照してください。 pkg.go.devなどの他のツールやWebサイトは、他の名前のファイルも認識する可能性があります。
また、go
コマンドはモジュールの.zip
ファイルを作成する際にシンボリックリンクを含めません。ファイルパスとサイズに関する制約を参照してください。したがって、リポジトリのルートディレクトリにLICENSE
ファイルがない場合は、作成者は代わりにサブディレクトリで定義されたモジュールにライセンスファイルのコピーを作成して、これらのファイルがモジュールの.zip
ファイルに含まれるようにする必要があります。
GOVCS
を使用したバージョン管理ツールの制御
git
などのバージョン管理コマンドを使用してモジュールをダウンロードするgo
コマンドの機能は、コードを任意のサーバーからインポートできる分散型パッケージエコシステムにとって重要です。悪意のあるサーバーが呼び出されたバージョン管理コマンドに意図しないコードを実行させる方法を見つけた場合、セキュリティ上の問題にもなります。
機能とセキュリティ上の懸念のバランスを取るために、go
コマンドはデフォルトで、パブリックサーバーからのコードのダウンロードにgit
とhg
のみを使用します。GOPRIVATE
環境変数と一致するパッケージをホスティングするサーバー(プライベートサーバーとして定義)からのコードのダウンロードには、任意の既知のバージョン管理システムを使用します。GitとMercurialのみを許可する理由としては、これら2つのシステムが、信頼できないサーバーのクライアントとして実行される問題に最も多くの注意が払われてきた点が挙げられます。対照的に、Bazaar、Fossil、Subversionは主に信頼できる認証済みの環境で使用されており、攻撃対象領域としてそれほど綿密に調査されていません。
バージョン管理コマンドの制限は、コードをダウンロードするために直接バージョン管理アクセスを使用する場合にのみ適用されます。プロキシからモジュールをダウンロードする場合、go
コマンドは代わりにGOPROXY
プロトコルを使用し、これは常に許可されます。デフォルトでは、go
コマンドはパブリックモジュールにGoモジュールミラー(proxy.golang.org)を使用し、プライベートモジュールの場合、またはミラーがパブリックパッケージを提供することを拒否した場合(通常は法的理由による)にのみ、バージョン管理にフォールバックします。そのため、クライアントは、これらのダウンロードがカスタムサンドボックスを使用してバージョン管理コマンドを実行するセキュリティリスクを引き受けるGoモジュールミラーを使用するため、デフォルトでBazaar、Fossil、またはSubversionリポジトリから提供されるパブリックコードにアクセスできます。
GOVCS
変数を使用して、特定のモジュールについて許可されるバージョン管理システムを変更できます。GOVCS
変数は、モジュール対応モードとGOPATHモードの両方でパッケージをビルドする場合に適用されます。モジュールを使用する場合、パターンはモジュールパスと一致します。GOPATHを使用する場合、パターンはバージョン管理リポジトリのルートに対応するインポートパスと一致します。
GOVCS
変数の一般的な形式は、コンマ区切りのpattern:vcslist
ルールのリストです。パターンはglobパターンであり、モジュールまたはインポートパスの先頭要素の1つ以上と一致する必要があります。vcslistは、許可されるバージョン管理コマンドのパイプ区切りのリスト、または任意の既知のコマンドの使用を許可するall
、または何も許可しないoff
です。モジュールがvcslist off
のパターンと一致する場合でも、元のサーバーがmod
スキームを使用している場合(go
コマンドにGOPROXY
プロトコルを使用してモジュールをダウンロードするように指示する)は、ダウンロードされる可能性があります。リスト内の最も早い一致パターンが適用され、後のパターンも一致する可能性があっても同様です。
たとえば、以下を考えてみてください。
GOVCS=github.com:git,evil.com:off,*:git|hg
この設定では、github.com/
で始まるモジュールまたはインポートパスを持つコードはgit
のみを使用できます。evil.com
のパスはバージョン管理コマンドを使用できず、その他のすべてのパス(*
はすべてに一致します)はgit
またはhg
のみを使用できます。
特別なパターンpublic
とprivate
は、パブリックとプライベートのモジュールまたはインポートパスと一致します。パスがGOPRIVATE
変数と一致する場合、そのパスはプライベートです。それ以外の場合はパブリックです。
GOVCS
変数のルールが特定のモジュールまたはインポートパスと一致しない場合、go
コマンドはデフォルトルールを適用します。これは、GOVCS
表記ではpublic:git|hg,private:all
と要約できます。
任意のパッケージで任意のバージョン管理システムを自由に使用できるようにするには、以下を使用します。
GOVCS=*:all
バージョン管理のすべての使用を無効にするには、以下を使用します。
GOVCS=*:off
go env -w
コマンドを使用して、将来のgoコマンドの呼び出しのためにGOVCS
変数を設定できます。
GOVCS
はGo 1.16で導入されました。それ以前のバージョンのGoでは、任意のモジュールに任意の既知のバージョン管理ツールを使用できます。
モジュールのzipファイル
モジュールバージョンは.zip
ファイルとして配布されます。go
コマンドはモジュールプロキシおよびバージョン管理リポジトリから自動的に作成、ダウンロード、および展開するため、これらのファイルと直接やり取りする必要はほとんどありません。ただし、クロスプラットフォームの互換性の制約を理解する場合や、モジュールプロキシを実装する場合には、これらのファイルについて知っておくと役立ちます。
go mod download
コマンドは、1つ以上のモジュールのzipファイルをダウンロードし、それらのファイルをモジュールキャッシュに展開します。GOPROXY
およびその他の環境変数に応じて、go
コマンドはプロキシからzipファイルをダウンロードするか、ソース管理リポジトリを複製してzipファイルを作成します。-json
フラグを使用して、ダウンロードしたzipファイルとそのモジュールキャッシュ内の展開済みコンテンツの場所を見つけることができます。
golang.org/x/mod/zip
パッケージを使用して、zipファイルの作成、展開、またはコンテンツのプログラムによるチェックを行うことができます。
ファイルパスとサイズに関する制約
モジュールのzipファイルの内容には、いくつかの制限があります。これらの制約により、zipファイルは幅広いプラットフォームで安全かつ一貫して展開できます。
- モジュールのzipファイルのサイズは最大500 MiBです。ファイルの合計非圧縮サイズも500 MiBに制限されています。
go.mod
ファイルは16 MiBに制限されています。LICENSE
ファイルも16 MiBに制限されています。これらの制限は、ユーザー、プロキシ、およびモジュールエコシステムの他の部分に対するサービス拒否攻撃を軽減するために存在します。モジュールディレクトリツリーに500 MiBを超えるファイルが含まれているリポジトリでは、モジュールのパッケージのビルドに必要なファイルのみを含むコミットでモジュールバージョンをタグ付けする必要があります。ビデオ、モデル、その他の大きなアセットは通常、ビルドには必要ありません。 - モジュールのzipファイル内の各ファイルは、
$module@$version/
というプレフィックスで始まる必要があります。ここで、$module
はモジュールパス、$version
はバージョン(例:golang.org/x/mod@v0.3.0/
)です。モジュールパスは有効で、バージョンは有効で標準的で、バージョンはモジュールパスのメジャーバージョンサフィックスと一致する必要があります。具体的な定義と制限については、モジュールパスとバージョンを参照してください。 - ファイルモード、タイムスタンプ、その他のメタデータは無視されます。
- 空のディレクトリ(パスがスラッシュで終わるエントリ)はモジュールのzipファイルに含めることができますが、展開されません。
go
コマンドは、作成するzipファイルに空のディレクトリを含めません。 - シンボリックリンクやその他の不正なファイルは、zipファイルの作成時には無視されます。これは、オペレーティングシステムやファイルシステム間で移植性がなく、zipファイル形式で移植可能な方法で表現する方法がないためです。
vendor
という名前のディレクトリ内のファイルは、zipファイルの作成時には無視されます。これは、メインモジュール外のvendor
ディレクトリは決して使用されないためです。go.mod
ファイルを含むディレクトリ内にあるファイルは、モジュールルートディレクトリ以外の場合は、zip ファイルの作成時に無視されます。これは、それらがモジュールの一部ではないためです。go
コマンドは、zip ファイルの展開時に、go.mod
ファイルを含むサブディレクトリを無視します。- zip ファイル内の 2 つのファイルのパスは、Unicode の大文字小文字の折り畳み(
strings.EqualFold
を参照)の下で等しくあってはなりません。これにより、大文字小文字を区別しないファイルシステムで zip ファイルを展開しても、競合が発生しません。 go.mod
ファイルは、トップレベルディレクトリ($module@$version/go.mod
)に存在する場合と存在しない場合があります。存在する場合は、ファイル名はgo.mod
(すべて小文字)でなければなりません。go.mod
という名前のファイルは、他のディレクトリには配置できません。- モジュール内のファイル名とディレクトリ名は、Unicode 文字、ASCII 数字、ASCII スペース文字(U+0020)、および ASCII 記号
!#$%&()+,-.=@[]^_{}~
で構成できます。ただし、パッケージパスにはこれらのすべての文字を含めることができないことに注意してください。module.CheckFilePath
とmodule.CheckImportPath
を参照して、違いを確認してください。 - 最初のドットまでのファイル名またはディレクトリ名は、大文字小文字を問わず、Windows の予約済みファイル名(
CON
、com1
、NuL
など)であってはなりません。
プライベートモジュール
Go モジュールは、パブリックインターネットでは利用できないバージョン管理サーバーやモジュールプロキシで頻繁に開発および配布されます。go
コマンドはプライベートソースからモジュールをダウンロードしてビルドできますが、通常はいくつかの設定が必要です。
プライベートモジュールへのアクセスを設定するには、以下の環境変数を使用できます。「環境変数」セクションを参照して詳細を確認してください。「プライバシー」セクションも参照して、パブリックサーバーに送信される情報を制御する方法を確認してください。
GOPROXY
— モジュールプロキシURLのリスト。go
コマンドは、各サーバーから順にモジュールをダウンロードしようとします。キーワードdirect
は、go
コマンドに、プロキシを使用する代わりに、モジュールが開発されているバージョン管理リポジトリからモジュールをダウンロードするように指示します。GOPRIVATE
— プライベートと見なされるべきモジュールパスのプレフィックスのglobパターンリスト。GONOPROXY
とGONOSUMDB
のデフォルト値として機能します。GONOPROXY
— プロキシからダウンロードされないモジュールパスのプレフィックスのglobパターンリスト。go
コマンドは、GOPROXY
に関係なく、一致するモジュールを、モジュールが開発されているバージョン管理リポジトリからダウンロードします。GONOSUMDB
— パブリックチェックサムデータベース(sum.golang.org)を使用してチェックされないモジュールパスのプレフィックスのglobパターンリスト。GOINSECURE
— HTTPやその他の安全でないプロトコルで取得できるモジュールパスのプレフィックスのglobパターンリスト。
これらの変数は、開発環境(たとえば、.profile
ファイル)で設定するか、go env -w
を使用して永続的に設定できます。
このセクションの残りの部分では、プライベートモジュールプロキシとバージョン管理リポジトリへのアクセスを提供するための一般的なパターンについて説明します。
すべてのモジュールを提供するプライベートプロキシ
すべてのモジュール(パブリックとプライベートの両方)を提供する中央のプライベートプロキシサーバーは、管理者にとって最も多くの制御を提供し、個々の開発者にとって最小限の設定しか必要としません。
このようなサーバーを使用するようにgo
コマンドを設定するには、以下の環境変数を設定します。https://proxy.corp.example.com
をプロキシURLに、corp.example.com
をモジュールプレフィックスに置き換えます。
GOPROXY=https://proxy.corp.example.com
GONOSUMDB=corp.example.com
GOPROXY
設定は、go
コマンドがhttps://proxy.corp.example.com
からのみモジュールをダウンロードするように指示します。go
コマンドは他のプロキシまたはバージョン管理リポジトリに接続しません。
GONOSUMDB
設定は、go
コマンドがパブリックチェックサムデータベースを使用して、corp.example.com
で始まるパスのモジュールを認証しないように指示します。
この構成で実行されているプロキシは、プライベートバージョン管理サーバーへの読み取りアクセスが必要になる可能性があります。また、パブリックモジュールの新しいバージョンをダウンロードするために、パブリックインターネットへのアクセスも必要になります。
このような方法で使用できるGOPROXY
サーバーの既存の実装はいくつかあります。最小限の実装は、モジュールキャッシュディレクトリからファイルを提供し、不足しているモジュールを取得するためにgo mod download
(適切な設定で)を使用します。
プライベートモジュールを提供するプライベートプロキシ
プライベートプロキシサーバーは、公開されているモジュールを提供することなく、プライベートモジュールを提供できます。go
コマンドは、プライベートサーバーで利用できないモジュールについては、パブリックソースにフォールバックするように設定できます。
この方法で動作するようにgo
コマンドを設定するには、以下の環境変数を設定します。https://proxy.corp.example.com
をプロキシURLに、corp.example.com
をモジュールプレフィックスに置き換えます。
GOPROXY=https://proxy.corp.example.com,https://proxy.golang.org,direct
GONOSUMDB=corp.example.com
GOPROXY
設定は、go
コマンドが最初にhttps://proxy.corp.example.com
からモジュールをダウンロードしようとすると指示します。そのサーバーが404(見つかりません)または410(削除されました)で応答した場合、go
コマンドはhttps://proxy.golang.org
にフォールバックし、次にリポジトリへの直接接続にフォールバックします。
GONOSUMDB
設定は、go
コマンドがパブリックチェックサムデータベースを使用して、パスがcorp.example.com
で始まるモジュールを認証しないように指示します。
この構成で使用されるプロキシは、それ自体が提供していなくても、パブリックモジュールへのアクセスを制御できることに注意してください。プロキシが404または410以外のエラーステータスでリクエストに応答した場合、go
コマンドはGOPROXY
リストの後続のエントリにフォールバックしません。たとえば、プロキシは、不適切なライセンスを持つモジュールまたは既知のセキュリティ上の脆弱性のあるモジュールに対して403(禁止)で応答できます。
プライベートモジュールへの直接アクセス
go
コマンドは、パブリックプロキシをバイパスして、バージョン管理サーバーからプライベートモジュールを直接ダウンロードするように設定できます。これは、プライベートプロキシサーバーの実行が不可能な場合に便利です。
この方法で動作するようにgo
コマンドを設定するには、GOPRIVATE
を設定し、corp.example.com
をプライベートモジュールプレフィックスに置き換えます。
GOPRIVATE=corp.example.com
この状況では、GOPROXY
変数を変更する必要はありません。デフォルト値はhttps://proxy.golang.org,direct
で、これはgo
コマンドに、最初にhttps://proxy.golang.org
からモジュールをダウンロードしようとさせ、そのプロキシが404(見つかりません)または410(削除されました)で応答した場合に直接接続にフォールバックするように指示します。
GOPRIVATE
設定は、go
コマンドがcorp.example.com
で始まるモジュールについて、プロキシまたはチェックサムデータベースに接続しないように指示します。
内部HTTPサーバーは、モジュールパスをリポジトリURLに解決するために必要となる場合があります。たとえば、go
コマンドがモジュールcorp.example.com/mod
をダウンロードする場合、https://corp.example.com/mod?go-get=1
へのGETリクエストを送信し、レスポンスからリポジトリURLを検索します。この要件を回避するには、各プライベートモジュールパスに、リポジトリルートプレフィックスを示すVCSサフィックス(.git
など)を含めるようにします。たとえば、go
コマンドがモジュールcorp.example.com/repo.git/mod
をダウンロードする場合、追加のリクエストを行うことなく、https://corp.example.com/repo.git
またはssh://corp.example.com/repo.git
にあるGitリポジトリをクローンします。
開発者は、プライベートモジュールを含むリポジトリへの読み取りアクセス権が必要です。これは、.gitconfig
などのグローバルVCS設定ファイルで設定できます。VCSツールは、インタラクティブな認証プロンプトを必要としないように設定するのが最適です。デフォルトでは、Gitを呼び出す場合、go
コマンドはGIT_TERMINAL_PROMPT=0
を設定することでインタラクティブなプロンプトを無効にしますが、明示的な設定は尊重します。
プライベートプロキシへの資格情報の渡す
go
コマンドは、プロキシサーバーと通信する場合、HTTP 基本認証をサポートしています。
資格情報は、.netrc
ファイルで指定できます。たとえば、以下の行を含む.netrc
ファイルは、指定されたユーザー名とパスワードを使用して、マシンproxy.corp.example.com
に接続するようにgo
コマンドを設定します。
machine proxy.corp.example.com
login jrgopher
password hunter2
ファイルの場所は、NETRC
環境変数で設定できます。NETRC
が設定されていない場合、go
コマンドはUNIXライクなプラットフォームでは$HOME/.netrc
を、Windowsでは%USERPROFILE%\_netrc
を読み取ります。
.netrc
のフィールドは、スペース、タブ、改行で区切られています。残念ながら、これらの文字はユーザー名やパスワードでは使用できません。また、マシン名は完全なURLにすることができないため、同じマシン上の異なるパスに対して異なるユーザー名とパスワードを指定することはできません。
あるいは、資格情報をGOPROXY
URLに直接指定することもできます。例えば、
GOPROXY=https://jrgopher:hunter2@proxy.corp.example.com
この方法を使用する際には注意してください。環境変数はシェル履歴やログに表示される可能性があります。
プライベートリポジトリへの資格情報の渡す
go
コマンドは、モジュールをバージョン管理リポジトリから直接ダウンロードできます。これは、プライベートプロキシを使用しない場合、プライベートモジュールに必要なことです。「プライベートモジュールへの直接アクセス」セクションを参照して設定を確認してください。
go
コマンドは、モジュールを直接ダウンロードする際に、git
などのバージョン管理ツールを実行します。これらのツールは独自の認証を実行するため、.gitconfig
などのツール固有の設定ファイルで資格情報を設定する必要がある場合があります。
これがスムーズに機能することを確認するために、go
コマンドが正しいリポジトリURLを使用し、バージョン管理ツールがパスワードのインタラクティブな入力を求めないことを確認してください。go
コマンドは、リポジトリURLを検索する際にスキームが指定されていない限り、他のスキーム(ssh://
など)よりもhttps://
URLを優先します。特にGitHubリポジトリの場合、go
コマンドはhttps://
を想定しています。
ほとんどのサーバーでは、クライアントをHTTP経由で認証するように設定できます。たとえば、GitHubはOAuthパーソナルアクセストークンをHTTPパスワードとして使用することをサポートしています。「プライベートプロキシへの資格情報の渡す」セクションと同様に、HTTPパスワードを.netrc
ファイルに保存できます。
あるいは、https://
URLを別のスキームに書き換えることもできます。たとえば、.gitconfig
では
[url "git@github.com:"]
insteadOf = https://github.com/
詳細については、「なぜ「go get」はリポジトリのクローン作成時にHTTPSを使用するのですか?」を参照してください。
プライバシー
go
コマンドは、モジュールプロキシサーバーとバージョン管理システムからモジュールとメタデータをダウンロードする場合があります。環境変数GOPROXY
は、どのサーバーが使用されるかを制御します。環境変数GOPRIVATE
とGONOPROXY
は、プロキシからどのモジュールがフェッチされるかを制御します。
GOPROXY
のデフォルト値は
https://proxy.golang.org,direct
この設定では、go
コマンドがモジュールまたはモジュールメタデータをダウンロードする場合、最初にGoogleが運営する公開モジュールプロキシであるproxy.golang.org
にリクエストを送信します(プライバシーポリシー)。各リクエストで送信される情報については、GOPROXY
プロトコルを参照してください。go
コマンドは個人を特定できる情報を送信しませんが、リクエストされている完全なモジュールパスは送信します。プロキシが404(見つかりません)または410(削除済み)のステータスで応答した場合、go
コマンドはモジュールを提供するバージョン管理システムに直接接続しようとします。詳細については、バージョン管理システムを参照してください。
GOPRIVATE
またはGONOPROXY
環境変数は、プライベートであり、プロキシからリクエストされるべきではないモジュールプレフィックスに一致するglobパターンの一覧に設定できます。例:
GOPRIVATE=*.corp.example.com,*.research.example.com
GOPRIVATE
は単にGONOPROXY
とGONOSUMDB
のデフォルトとして機能するため、GONOSUMDB
に異なる値を設定する必要がない限り、GONOPROXY
を設定する必要はありません。モジュールパスがGONOPROXY
に一致する場合、go
コマンドはそのモジュールに対してGOPROXY
を無視し、そのバージョン管理リポジトリから直接フェッチします。これは、プライベートモジュールを提供するプロキシがない場合に便利です。プライベートモジュールへの直接アクセスを参照してください。
すべてのモジュールを提供する信頼できるプロキシがある場合、GONOPROXY
を設定しないでください。たとえば、GOPROXY
が1つのソースに設定されている場合、go
コマンドは他のソースからモジュールをダウンロードしません。この状況では、GONOSUMDB
を設定する必要があります。
GOPROXY=https://proxy.corp.example.com
GONOSUMDB=*.corp.example.com,*.research.example.com
プライベートモジュールのみを提供する信頼できるプロキシがある場合、GONOPROXY
を設定する必要はありませんが、プロキシが正しいステータスコードで応答するように注意する必要があります。たとえば、次の構成を考えてみましょう。
GOPROXY=https://proxy.corp.example.com,https://proxy.golang.org
GONOSUMDB=*.corp.example.com,*.research.example.com
タイプミスにより、開発者が存在しないモジュールをダウンロードしようとしたとします。
go mod download corp.example.com/secret-product/typo@latest
go
コマンドは最初に、proxy.corp.example.com
からこのモジュールをリクエストします。そのプロキシが404(見つかりません)または410(削除済み)で応答した場合、go
コマンドはproxy.golang.org
にフォールバックし、リクエストURLにsecret-product
パスを送信します。プライベートプロキシが他のエラーコードで応答した場合、go
コマンドはエラーを出力し、他のソースにフォールバックしません。
プロキシに加えて、go
コマンドはチェックサムデータベースに接続して、go.sum
にリストされていないモジュールの暗号化ハッシュを検証できます。GOSUMDB
環境変数は、チェックサムデータベースの名前、URL、公開鍵を設定します。GOSUMDB
のデフォルト値はsum.golang.org
であり、これはGoogleが運営する公開チェックサムデータベースです(プライバシーポリシー)。各リクエストで送信される情報については、チェックサムデータベースを参照してください。プロキシと同様に、go
コマンドは個人を特定できる情報を送信しませんが、リクエストされている完全なモジュールパスは送信し、チェックサムデータベースは非公開モジュールのチェックサムを計算できません。
GONOSUMDB
環境変数は、プライベートであり、チェックサムデータベースからリクエストされるべきではないモジュールを示すパターンに設定できます。GOPRIVATE
はGONOSUMDB
とGONOPROXY
のデフォルトとして機能するため、GONOPROXY
に異なる値を設定する必要がない限り、GONOSUMDB
を設定する必要はありません。
プロキシはチェックサムデータベースをミラーリングすることができます。GOPROXY
のプロキシがこの機能を持っている場合、go
コマンドはチェックサムデータベースに直接接続しません。
チェックサムデータベースの使用を完全に無効にするには、GOSUMDB
をoff
に設定できます。この設定では、go
コマンドは、ダウンロードされたモジュールが既にgo.sum
にある場合を除き、ダウンロードされたモジュールを認証しません。モジュールの認証を参照してください。
モジュールキャッシュ
モジュールキャッシュとは、go
コマンドがダウンロードしたモジュールファイルを保存するディレクトリです。モジュールキャッシュは、コンパイルされたパッケージやその他のビルド成果物を含むビルドキャッシュとは異なります。
モジュールキャッシュのデフォルトの場所は$GOPATH/pkg/mod
です。別の場所を使用するには、GOMODCACHE
環境変数を設定します。
モジュールキャッシュには最大サイズがなく、go
コマンドは自動的にその内容を削除しません。
キャッシュは、同じマシンで開発された複数のGoプロジェクトで共有できます。go
コマンドは、メインモジュールの場所にかかわらず、同じキャッシュを使用します。複数のgo
コマンドインスタンスが、同時に同じモジュールキャッシュに安全にアクセスできます。
go
コマンドは、ダウンロード後にモジュールが誤って変更されるのを防ぐために、読み取り専用権限でキャッシュにモジュールソースファイルとディレクトリを作成します。これには、rm -rf
などのコマンドでキャッシュを削除しにくくなるという不都合な副作用があります。代わりに、go clean -modcache
を使用してキャッシュを削除できます。あるいは、-modcacherw
フラグを使用すると、go
コマンドは読み書き権限を持つ新しいディレクトリを作成します。これにより、エディター、テスト、その他のプログラムがモジュールキャッシュ内のファイルを修正するリスクが高まります。go mod verify
コマンドを使用して、メインモジュールの依存関係に対する変更を検出できます。これは、各モジュール依存関係の抽出されたコンテンツをスキャンし、go.sum
の予想されるハッシュと一致することを確認します。
次の表は、モジュールキャッシュ内のほとんどのファイルの目的を説明しています。一部の一時ファイル(ロックファイル、一時ディレクトリ)は省略されています。各パスについて、$module
はモジュールパス、$version
はバージョンです。スラッシュ(/
)で終わるパスはディレクトリです。モジュールパスとバージョンの大文字は、大文字と小文字を区別しないファイルシステムでの競合を避けるため、感嘆符(!
)を使用してエスケープされます(Azure
は!azure
としてエスケープされます)。
パス | 説明 |
---|---|
$module@$version/ |
モジュールの.zip ファイルの抽出された内容を含むディレクトリ。これは、ダウンロードされたモジュールのモジュールルートディレクトリとして機能します。元のモジュールにgo.mod ファイルがない場合は、このファイルは含まれません。 |
cache/download/ |
モジュールプロキシからダウンロードされたファイルと、バージョン管理システムから取得されたファイルを含むディレクトリ。このディレクトリのレイアウトはGOPROXY プロトコルに従っているため、このディレクトリはHTTPファイルサーバーで提供される場合や、file:// URLで参照される場合にプロキシとして使用できます。 |
cache/download/$module/@v/list |
既知のバージョンのリスト(GOPROXY プロトコルを参照)。これは時間の経過とともに変化する可能性があるため、go コマンドは通常、このファイルの再利用ではなく、新しいコピーを取得します。 |
cache/download/$module/@v/$version.info |
バージョンに関するJSONメタデータ(GOPROXY プロトコルを参照)。これは時間の経過とともに変化する可能性があるため、go コマンドは通常、このファイルの再利用ではなく、新しいコピーを取得します。 |
cache/download/$module/@v/$version.mod |
このバージョンのgo.mod ファイル(GOPROXY プロトコルを参照)。元のモジュールにgo.mod ファイルがない場合、これは要件のない合成ファイルです。 |
cache/download/$module/@v/$version.zip |
モジュールの圧縮内容(GOPROXY プロトコルおよびモジュールzipファイルを参照)。 |
cache/download/$module/@v/$version.ziphash |
.zip ファイル内のファイルの暗号化ハッシュ。.zip ファイル自体がハッシュ化されるわけではないため、ファイルの順序、圧縮、配置、メタデータはハッシュに影響しません。モジュールを使用する場合、go コマンドは、このハッシュがgo.sum の対応する行と一致することを確認します。go mod verify コマンドは、モジュールの.zip ファイルと抽出されたディレクトリのハッシュがこれらのファイルと一致することを確認します。 |
cache/download/sumdb/ |
チェックサムデータベース(通常はsum.golang.org )からダウンロードされたファイルを含むディレクトリ。 |
cache/vcs/ |
ソースから直接フェッチされたモジュールのクローンされたバージョン管理リポジトリが含まれています。ディレクトリ名は、リポジトリの種類とURLから派生した16進数エンコードされたハッシュです。リポジトリは、ディスク上のサイズが最適化されています。たとえば、クローンされたGitリポジトリは、可能な限りベアでシャローです。 |
モジュールの認証
go
コマンドがzipファイルまたはgo.mod
ファイルをモジュールキャッシュにダウンロードすると、暗号化ハッシュを計算し、既知の値と比較して、ファイルが最初にダウンロードされてから変更されていないことを確認します。ダウンロードされたファイルに正しいハッシュがない場合、go
コマンドはセキュリティエラーを報告します。
go.mod
ファイルの場合、go
コマンドはファイルの内容からハッシュを計算します。モジュールzipファイルの場合、go
コマンドは、アーカイブ内のファイルの名前と内容を決定的な順序でハッシュを計算します。ファイルの順序、圧縮、配置、その他のメタデータはハッシュに影響しません。golang.org/x/mod/sumdb/dirhash
でハッシュの実装の詳細を参照してください。
go
コマンドは、各ハッシュをメインモジュールのgo.sum
ファイルの対応する行と比較します。ハッシュがgo.sum
のハッシュと異なる場合、go
コマンドはセキュリティエラーを報告し、ダウンロードされたファイルを削除してモジュールキャッシュに追加しません。
go.sum
ファイルが存在しない場合、またはダウンロードされたファイルのハッシュが含まれていない場合、go
コマンドは、公開されているモジュールのハッシュのグローバルソースであるチェックサムデータベースを使用してハッシュを確認できます。ハッシュが検証されると、go
コマンドはそれをgo.sum
に追加し、ダウンロードされたファイルをモジュールキャッシュに追加します。モジュールがプライベートである場合(GOPRIVATE
またはGONOSUMDB
環境変数によって一致する場合)、またはチェックサムデータベースが無効になっている場合(GOSUMDB=off
を設定した場合)、go
コマンドはハッシュを受け入れ、検証せずにファイルをモジュールキャッシュに追加します。
モジュールキャッシュは通常、システム上のすべてのGoプロジェクトで共有され、各モジュールには、異なるハッシュを持つ独自のgo.sum
ファイルがある場合があります。他のモジュールを信頼する必要を避けるために、go
コマンドは、モジュールキャッシュ内のファイルにアクセスするたびに、メインモジュールのgo.sum
を使用してハッシュを検証します。zipファイルのハッシュの計算にはコストがかかるため、go
コマンドは、ファイルを再ハッシュする代わりに、zipファイルと共に保存されている事前に計算されたハッシュを確認します。go mod verify
コマンドを使用して、zipファイルと抽出されたディレクトリがモジュールキャッシュに追加されてから変更されていないことを確認できます。
go.sumファイル
モジュールには、ルートディレクトリにgo.mod
ファイルと共にgo.sum
という名前のテキストファイルが含まれている場合があります。go.sum
ファイルには、モジュールの直接および間接的な依存関係の暗号化ハッシュが含まれています。go
コマンドがモジュールの.mod
または.zip
ファイルをモジュールキャッシュにダウンロードすると、ハッシュを計算し、そのハッシュがメインモジュールのgo.sum
ファイル内の対応するハッシュと一致することを確認します。モジュールに依存関係がない場合、またはreplace
ディレクティブを使用してすべての依存関係がローカルディレクトリに置き換えられている場合、go.sum
は空であるか、存在しない場合があります。
go.sum
の各行には、スペースで区切られた3つのフィールドがあります。モジュールパス、バージョン(/go.mod
で終わる場合もあります)、およびハッシュです。
- モジュールパスは、ハッシュが属するモジュールの名前です。
- バージョンは、ハッシュが属するモジュールのバージョンです。バージョンが
/go.mod
で終わる場合、ハッシュはモジュールのgo.mod
ファイルのみを対象としています。それ以外の場合は、モジュールの.zip
ファイル内のファイルを対象としています。 - ハッシュ列は、アルゴリズム名(
h1
など)とbase64でエンコードされた暗号化ハッシュで構成され、コロン(:
)で区切られています。現在、SHA-256(h1
)のみがサポートされているハッシュアルゴリズムです。将来的にSHA-256の脆弱性が発見された場合、別のアルゴリズム(h2
など)のサポートが追加されます。
go.sum
ファイルには、モジュールの複数のバージョンのハッシュが含まれている場合があります。最小バージョン選択を実行するために、go
コマンドは依存関係の複数のバージョンのgo.mod
ファイルをロードする必要がある場合があります。go.sum
には、不要になったモジュールバージョンのハッシュ(たとえば、アップグレード後)も含まれている場合があります。go mod tidy
は、不足しているハッシュを追加し、go.sum
から不要なハッシュを削除します。
チェックサムデータベース
チェックサムデータベースは、go.sum
行のグローバルなソースです。go
コマンドは、多くの状況でこれを使用して、プロキシまたはオリジンサーバーによる不正な動作を検出できます。
チェックサムデータベースは、公開されているすべてのモジュールバージョンのグローバルな整合性と信頼性を確保します。これにより、不正なコードが気付かれずに提供されることがないため、信頼できないプロキシが可能になります。また、モジュールの作成者が後でリポジトリのタグを変更した場合でも、特定のバージョンに関連付けられたビットが日々変化しないことを保証します。
チェックサムデータベースは、Googleによって運営されているsum.golang.orgによって提供されています。これは、Trillianによってバックアップされたgo.sum
行ハッシュのトランスペアレントログ(または「Merkle Tree」)です。Merkleツリーの主な利点は、独立した監査者が改ざんされていないことを検証できるため、単純なデータベースよりも信頼性が高いことです。
go
コマンドは、提案:パブリックGoモジュールエコシステムのセキュリティ保護で最初に概説されたプロトコルを使用して、チェックサムデータベースと対話します。
次の表は、チェックサムデータベースが応答する必要があるクエリを指定しています。各パスについて、$base
はチェックサムデータベースURLのパス部分、$module
はモジュールパス、$version
はバージョンです。たとえば、チェックサムデータベースURLがhttps://sum.golang.org
で、クライアントがバージョンv0.3.2
でモジュールgolang.org/x/text
のレコードを要求している場合、クライアントはhttps://sum.golang.org/lookup/golang.org/x/text@v0.3.2
に対するGET
リクエストを送信します。
大文字と小文字を区別しないファイルシステムから提供する場合のあいまいさを回避するために、$module
および$version
要素は、大文字を感嘆符とそれに対応する小文字に置き換えることによってケースエンコードされます。これにより、モジュールexample.com/M
とexample.com/m
の両方をディスクに保存できます(前者はexample.com/!m
としてエンコードされるため)。
角括弧で囲まれたパスの部分は、[.p/$W]
のように、オプションの値を表します。
パス | 説明 |
---|---|
$base/latest |
最新のログの署名付きエンコードされたツリー記述を返します。この署名付き記述は、1つ以上のサーバーキーによって署名され、サーバーの公開キーを使用して検証できるテキストであるnoteの形式です。ツリー記述は、ツリーのサイズと、そのサイズのツリーヘッドのハッシュを提供します。このエンコーディングは、 golang.org/x/mod/sumdb/tlog#FormatTree で説明されています。 |
$base/lookup/$module@$version |
$version で$module に関するエントリのログレコード番号、レコードのデータ(つまり、$version で$module のgo.sum 行)、およびレコードを含む署名付きエンコードされたツリー記述を返します。 |
$base/tile/$H/$L/$K[.p/$W] |
ログのセクションを構成するハッシュのセットである[ログタイル](https://research.swtch.com/tlog#serving_tiles)を返します。各タイルは、タイルレベル$L 、左から$K 番目の2次元座標で、タイルの高さは$H で定義されます。オプションの.p/$W サフィックスは、$W ハッシュのみを含む部分的なログタイルを示します。部分的なタイルが見つからない場合、クライアントは完全なタイルのフェッチにフォールバックする必要があります。 |
$base/tile/$H/data/$K[.p/$W] |
/tile/$H/0/$K[.p/$W] (リテラルのdata パス要素付き)のリーフハッシュのレコードデータを返します。 |
go
コマンドがチェックサムデータベースを参照する場合、最初のステップは/lookup
エンドポイントを介してレコードデータを取得することです。モジュールバージョンがログにまだ記録されていない場合、チェックサムデータベースは応答する前にオリジンサーバーからそれをフェッチしようとします。この/lookup
データは、このモジュールバージョンの合計とそのログ内での位置を提供し、クライアントに、証明を実行するためにフェッチする必要があるタイルを知らせます。go
コマンドは、「包含」証明(特定のレコードがログに存在すること)と「整合性」証明(ツリーが改ざんされていないこと)を実行してから、新しいgo.sum
行をメインモジュールのgo.sum
ファイルに追加します。/lookup
からのデータは、最初に署名されたツリーハッシュに対して認証し、署名されたツリーハッシュをクライアントの署名されたツリーハッシュのタイムラインに対して認証する前に使用しないことが重要です。
チェックサムデータベースによって提供される署名付きツリーハッシュと新しいタイルはモジュールキャッシュに保存されるため、go
コマンドは不足しているタイルのみをフェッチする必要があります。
go
コマンドは、チェックサムデータベースに直接接続する必要はありません。チェックサムデータベースをミラーリングし、上記のプロトコルをサポートするモジュールプロキシを介してモジュール合計を要求できます。これは、組織外の要求をブロックするプライベートな企業プロキシに特に役立ちます。
GOSUMDB
環境変数は、使用するチェックサムデータベースの名前、およびオプションでその公開キーとURLを識別します。
GOSUMDB="sum.golang.org"
GOSUMDB="sum.golang.org+<publickey>"
GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
go
コマンドはsum.golang.org
の公開キーを知っており、また、(中国本土で使用可能な)sum.golang.google.cn
という名前がsum.golang.org
チェックサムデータベースに接続していることも知っています。他のデータベースを使用するには、公開キーを明示的に指定する必要があります。URLは、データベース名の前にhttps://
が付いたものになります。
GOSUMDB
は、Googleが運営するGoチェックサムデータベースであるsum.golang.org
にデフォルト設定されています。サービスのプライバシーポリシーについては、https://sum.golang.org/privacyを参照してください。
GOSUMDB
がoff
に設定されている場合、またはgo get
が-insecure
フラグで呼び出された場合、チェックサムデータベースは参照されず、認識されないすべてのモジュールが受け入れられます。これは、すべてのモジュールについて検証可能な繰り返し可能なダウンロードのセキュリティ保証を放棄するという犠牲を伴います。特定のモジュールについてチェックサムデータベースをバイパスするより良い方法は、GOPRIVATE
またはGONOSUMDB
環境変数を使用することです。詳細については、プライベートモジュールを参照してください。
go env -w
コマンドを使用して、将来のgo
コマンドの呼び出しのためにこれらの変数を設定できます。
環境変数
go
コマンドでのモジュールの動作は、以下にリストされている環境変数を使用して構成できます。このリストには、モジュール関連の環境変数のみが含まれています。go
コマンドで認識されるすべての環境変数のリストについては、go help environment
を参照してください。
変数 | 説明 |
---|---|
GO111MODULE |
詳細については、モジュール認識コマンドを参照してください。 |
GOMODCACHE |
|
GOINSECURE |
常に安全ではない方法でフェッチできるモジュールパスのプレフィックスのglobパターン(Goの
|
GONOPROXY |
モジュールプロキシではなく、常にバージョン管理リポジトリから直接フェッチする必要があるモジュールパスのプレフィックスのglobパターン(Goの
|
GONOSUMDB |
|
GOPATH |
モジュール認識モードでは、モジュールキャッシュは最初の
|
GOPRIVATE |
プライベートと見なされるべきモジュールパス接頭辞のglobパターン(Goのpath.Match の構文)のカンマ区切りリスト。GOPRIVATE はGONOPROXY とGONOSUMDB のデフォルト値です。プライバシーを参照してください。GOPRIVATE は、モジュールがGOVCS に対してプライベートと見なされるかどうかについても決定します。 |
GOPROXY |
カンマ(
GOPROXY=file://$(go env GOMODCACHE)/cache/download プロキシURLの代わりに2つのキーワードを使用できます。
モジュールプロキシとパッケージをモジュールに解決するで、プロキシの使用方法の詳細を参照してください。 |
GOSUMDB |
使用するチェックサムデータベースの名前、およびオプションでその公開鍵とURLを識別します。例: GOSUMDB="sum.golang.org" GOSUMDB="sum.golang.org+<publickey>" GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
|
GOVCS |
public:git|hg,private:all
|
GOWORK |
|
用語集
ビルド制約:Goソースファイルがパッケージのコンパイル時に使用されるかどうかを決定する条件。ビルド制約は、ファイル名サフィックス(例:foo_linux_amd64.go
)またはビルド制約コメント(例:// +build linux,amd64
)で表現できます。ビルド制約を参照してください。
ビルドリスト:go build
、go list
、またはgo test
などのビルドコマンドで使用されるモジュールバージョンのリスト。ビルドリストは、メインモジュールのgo.mod
ファイルと、推移的に必要なモジュールのgo.mod
ファイルから、最小バージョン選択を使用して決定されます。ビルドリストには、モジュールグラフ内のすべてのモジュールのバージョンが含まれており、特定のコマンドに関連するモジュールだけではありません。
標準バージョン:+incompatible
以外のビルドメタデータサフィックスのない、正しくフォーマットされたバージョン。たとえば、v1.2.3
は標準バージョンですが、v1.2.3+meta
はそうではありません。
現在のモジュール:メインモジュールの同義語。
非推奨モジュール:作成者によってもはやサポートされていないモジュール(ただし、メジャーバージョンは、この目的のために別個のモジュールと見なされます)。非推奨モジュールは、そのgo.mod
ファイルの最新バージョンで非推奨コメントでマークされています。
直接依存関係:メインモジュールのパッケージまたはテストの.go
ソースファイルのimport
宣言にパスが表示されるパッケージ、またはそのようなパッケージを含むモジュール。(間接依存関係と比較してください。)
ダイレクトモード:環境変数の設定により、go
コマンドはモジュールプロキシではなく、バージョン管理システムからモジュールを直接ダウンロードします。GOPROXY=direct
は、すべてのモジュールに対してこれを行います。GOPRIVATE
とGONOPROXY
は、パターンリストに一致するモジュールに対してこれを行います。
go.mod
ファイル:モジュールのパス、要件、その他のメタデータを定義するファイル。モジュールのルートディレクトリに表示されます。go.mod
ファイルに関するセクションを参照してください。
go.work
ファイル ワークスペースで使用されるモジュールのセットを定義するファイル。go.work
ファイルに関するセクションを参照してください。
インポートパス:Goソースファイルでパッケージをインポートするために使用される文字列。パッケージパスと同義です。
間接依存関係:メインモジュールのパッケージまたはテストによって推移的にインポートされるが、メインモジュール内のimport
宣言にパスが表示されないパッケージ。または、モジュールグラフに表示されるが、メインモジュールによって直接インポートされるパッケージを提供しないモジュール。(直接依存関係と比較してください。)
遅延モジュール読み込み:Go 1.17での変更により、go 1.17
以降を指定するモジュールで、必要としないコマンドのモジュールグラフの読み込みを回避します。遅延モジュール読み込みを参照してください。
メインモジュール:go
コマンドが呼び出されるモジュール。メインモジュールは、現在のディレクトリまたは親ディレクトリのgo.mod
ファイルによって定義されます。モジュール、パッケージ、バージョンを参照してください。
メジャーバージョン:セマンティックバージョン(v1.2.3
の1
)の最初の番号。互換性のない変更を含むリリースでは、メジャーバージョンを増分し、マイナーバージョンとパッチバージョンを0に設定する必要があります。メジャーバージョンが0のセマンティックバージョンは不安定と見なされます。
メジャーバージョンサブディレクトリ:モジュールのメジャーバージョンサフィックスに一致するバージョン管理リポジトリ内のサブディレクトリ。モジュールを定義できます。たとえば、ルートパスexample.com/mod
のリポジトリ内のモジュールexample.com/mod/v2
は、リポジトリのルートディレクトリまたはメジャーバージョンサブディレクトリv2
に定義できます。リポジトリ内のモジュールディレクトリを参照してください。
メジャーバージョンサフィックス:メジャーバージョン番号に一致するモジュールパスのサフィックス。たとえば、example.com/mod/v2
の/v2
。メジャーバージョンサフィックスはv2.0.0
以降で必要であり、それ以前のバージョンでは許可されていません。メジャーバージョンサフィックスに関するセクションを参照してください。
最小バージョン選択(MVS):ビルドで使用されるすべてのモジュールのバージョンを決定するために使用されるアルゴリズム。最小バージョン選択に関するセクションで詳細を参照してください。
マイナーバージョン:セマンティックバージョン(v1.2.3
の2
)の2番目の番号。新しい下位互換性のある機能を含むリリースでは、マイナーバージョンを増分し、パッチバージョンを0に設定する必要があります。
モジュール:リリース、バージョン管理、および配布がまとめて行われるパッケージのコレクション。
モジュールキャッシュ:ダウンロードされたモジュールを格納するローカルディレクトリ(GOPATH/pkg/mod
にあります)。モジュールキャッシュを参照してください。
モジュールグラフ:メインモジュールにルートを置く、モジュール要件の有向グラフ。グラフの各頂点はモジュールであり、各辺はgo.mod
ファイルのrequire
ステートメントからのバージョンです(メインモジュールのgo.mod
ファイルのreplace
ステートメントとexclude
ステートメントに従います)。
モジュールグラフのプルーニング: Go 1.17 で導入された変更で、go 1.17
以降を指定するモジュールの推移的な依存関係を省略することで、モジュールグラフのサイズを削減します。モジュールグラフのプルーニングを参照してください。
モジュールパス: モジュールを識別し、モジュール内のパッケージインポートパスのプレフィックスとして機能するパスです。例えば、"golang.org/x/net"
など。
モジュールプロキシ: GOPROXY
プロトコルを実装するウェブサーバーです。go
コマンドは、モジュールプロキシからバージョン情報、go.mod
ファイル、モジュールのzipファイルをダウンロードします。
モジュールルートディレクトリ: モジュールを定義するgo.mod
ファイルを含むディレクトリです。
モジュールサブディレクトリ: モジュールパスのうち、リポジトリルートパス以降の部分で、モジュールが定義されているサブディレクトリを示します。空でない場合、モジュールサブディレクトリはセマンティックバージョンタグのプレフィックスにもなります。モジュールサブディレクトリには、メジャーバージョンサフィックスは含まれません(モジュールがメジャーバージョンサブディレクトリにあっても)。モジュールパスを参照してください。
パッケージ: 同じディレクトリにある、まとめてコンパイルされるソースファイルの集合です。Go言語仕様のパッケージセクションを参照してください。
パッケージパス: パッケージを一意に識別するパスです。パッケージパスは、モジュールパスとモジュール内のサブディレクトリを結合したものです。例えば、"golang.org/x/net/html"
は、モジュール"golang.org/x/net"
の"html"
サブディレクトリにあるパッケージのパッケージパスです。インポートパスの同義語です。
パッチバージョン: セマンティックバージョンにおける3番目の数値(v1.2.3
では3
)。モジュールの公開インターフェースに変更がないリリースでは、パッチバージョンを増分する必要があります。
プレリリースバージョン: パッチバージョンの直後にハイフンとドットで区切られた一連の識別子が続くバージョンです。例えば、v1.2.3-beta4
など。プレリリースバージョンは不安定とみなされ、他のバージョンとの互換性があると想定されません。プレリリースバージョンは対応するリリースバージョンよりも前にソートされます:v1.2.3-pre
はv1.2.3
の前に来ます。リリースバージョンも参照してください。
擬似バージョン: リビジョン識別子(Gitコミットハッシュなど)とバージョン管理システムからのタイムスタンプをエンコードしたバージョンです。例えば、v0.0.0-20191109021931-daa7c04131f5
など。非モジュールリポジトリとの互換性や、タグ付きバージョンが利用できない状況で使用されます。
リリースバージョン: プレリリースサフィックスのないバージョンです。例えば、v1.2.3
(v1.2.3-pre
ではない)。プレリリースバージョンも参照してください。
リポジトリルートパス: モジュールパスのうち、バージョン管理リポジトリのルートディレクトリに対応する部分です。モジュールパスを参照してください。
リトラクトされたバージョン: 時期尚早に公開されたか、公開後に重大な問題が見つかったため、依存すべきではないバージョンです。retract
ディレクティブを参照してください。
セマンティックバージョンタグ: バージョン管理リポジトリのタグで、バージョンを特定のリビジョンにマッピングします。バージョンとコミットのマッピングを参照してください。
選択されたバージョン: 最小バージョン選択によって選択された、特定のモジュールのバージョンです。選択されたバージョンは、モジュールグラフで見つかったモジュールパスのうち、最も高いバージョンです。
vendorディレクトリ: メインモジュールのパッケージをビルドするために必要な、他のモジュールからのパッケージを含むディレクトリです。go mod vendor
で管理されます。ベンダー管理を参照してください。
バージョン: モジュールの変更不能なスナップショットの識別子で、文字v
の後にセマンティックバージョンが続きます。バージョンに関するセクションを参照してください。
ワークスペース: 最小バージョン選択(MVS)を実行する際にメインモジュールとして使用される、ディスク上のモジュールの集合です。ワークスペースに関するセクションを参照してください。