go.mod ファイルのリファレンス

各 Go モジュールは、他のモジュールや Go のバージョンへの依存関係など、モジュールのプロパティを記述する go.mod ファイルによって定義されます。

これらのプロパティには以下が含まれます。

go mod init コマンドを実行すると、Go によって go.mod ファイルが生成されます。次の例では、go.mod ファイルを作成し、モジュールのモジュールパスを example/mymodule に設定します。

$ go mod init example/mymodule

依存関係を管理するには、goコマンドを使用します。これらのコマンドは、go.mod ファイルに記述されている要件が常に整合性を保ち、go.mod ファイルの内容が有効であることを保証します。これらのコマンドには、go getgo mod tidygo mod editコマンドなどがあります。

goコマンドのリファレンスについては、コマンド goを参照してください。コマンドラインでgo help *コマンド名*と入力すると(go help mod tidyなど)、ヘルプが表示されます。

参照

go.mod ファイルには、次の例に示すようにディレクティブが含まれています。これらについては、このトピックの他の場所で説明しています。

module example.com/mymodule

go 1.14

require (
    example.com/othermodule v1.2.3
    example.com/thismodule v1.2.3
    example.com/thatmodule v1.2.3
)

replace example.com/thatmodule => ../thatmodule
exclude example.com/thismodule v1.3.0

module

モジュールのモジュールパスを宣言します。これは、モジュールのバージョン番号と組み合わせてモジュールの固有の識別子となります。モジュールパスは、モジュールが含むすべてのパッケージのインポートプレフィックスになります。

詳細については、Go モジュールリファレンスにあるmodule ディレクティブを参照してください。

構文

module module-path
module-path
モジュールのモジュールパス。通常は、Go ツールによってモジュールをダウンロードできるリポジトリの場所です。バージョンv2以降のモジュールでは、この値はメジャーバージョン番号(例:/v2)で終わる必要があります。

次の例では、モジュールをダウンロードできるリポジトリドメインにexample.comを代用しています。

備考

モジュールパスは、モジュールを一意に識別する必要があります。ほとんどのモジュールでは、パスはgoコマンドがコードを見つけることができるURL(またはコードへのリダイレクト)です。直接ダウンロードされないモジュールの場合、モジュールパスは、一意性を保証する名前だけで構いません。プレフィックスexample/は、このような例でも予約されています。

詳細については、依存関係の管理を参照してください。

実際には、モジュールパスは通常、モジュールのソースのリポジトリドメインと、リポジトリ内のモジュールコードへのパスです。goコマンドは、モジュールユーザーに代わって依存関係を解決するために、モジュールバージョンをダウンロードする際にこの形式に依存します。

最初はモジュールを他のコードから使用できるようにするつもりがない場合でも、リポジトリパスを使用することはベストプラクティスです。後で公開する場合にモジュール名を変更する必要がなくなります。

最初にモジュールの最終的なリポジトリ場所がわからない場合は、所有するドメイン名または制御できる名前(会社の社名など)と、モジュールの名前またはソースディレクトリに続くパスなど、一時的な安全な代用を使用することを検討してください。詳細については、依存関係の管理を参照してください。

たとえば、stringtoolsディレクトリで開発している場合、一時的なモジュールパスは<company-name>/stringtoolsになる可能性があります。次の例では、company-nameは会社の社名です。

go mod init <company-name>/stringtools

go

モジュールが、ディレクティブによって指定された Go バージョンのセマンティクスを想定して記述されたことを示します。

詳細については、Go モジュールリファレンスにあるgo ディレクティブを参照してください。

構文

go minimum-go-version
minimum-go-version
このモジュールのパッケージをコンパイルするために必要なGoの最小バージョン。

備考

goディレクティブは、このモジュールを使用するために必要なGoの最小バージョンを設定します。Go 1.21より前は、このディレクティブは推奨事項のみでしたが、現在は必須要件です。Goツールチェーンは、新しいGoバージョンを宣言するモジュールを使用することを拒否します。

goディレクティブは、どのGoツールチェーンを実行するかを選択するための入力です。「Go ツールチェーン」で詳細をご覧ください。

goディレクティブは、新しい言語機能の使用に影響します

goディレクティブは、goコマンドの動作にも影響します

go.modファイルには、goディレクティブを最大1つ含めることができます。ほとんどのコマンドは、goディレクティブが存在しない場合、現在のGoバージョンを使用してgoディレクティブを追加します。

toolchain

このモジュールで使用することを推奨するGoツールチェーンを宣言します。モジュールがメインモジュールであり、デフォルトのツールチェーンが推奨されるツールチェーンより古い場合にのみ有効になります。

詳細については、「Go ツールチェーン」とGoモジュールリファレンスにあるtoolchainディレクティブを参照してください。

構文

toolchain toolchain-name
toolchain-name
推奨されるGoツールチェーンの名前。標準的なツールチェーン名は、Goバージョン`V`に対して`goV`という形式を取ります(例:`go1.21.0`、`go1.18rc1`)。特別な値`default`は、自動的なツールチェーンの切り替えを無効にします。

備考

`toolchain`行がGoツールチェーンの選択にどのように影響するかについての詳細は、「Goツールチェーン」を参照してください。

godebug

このモジュールのメインパッケージに適用されるデフォルトのGODEBUG設定を示します。これらはツールチェーンのデフォルト設定よりも優先されますが、メインパッケージ内の明示的な`//go:debug`行によって上書きされます。

構文

godebug debug-key=debug-value
debug-key
適用する設定の名前。設定の一覧とそれらが導入されたバージョンは、[GODEBUG履歴](https://go.dokyumento.jp/doc/godebug#history)で確認できます。
debug-value
設定に提供される値。特に指定がない限り、`0`は無効化、`1`は有効化を意味します。

備考

GODEBUG設定は、現在のモジュールのメインパッケージとテストバイナリのビルドのみに適用されます。モジュールが依存関係として使用されるときには効果がありません。

後方互換性についての詳細は、「Go、後方互換性、およびGODEBUG」を参照してください。

require

モジュールを現在のモジュールの依存関係として宣言し、必要なモジュールの最小バージョンを指定します。

詳細については、Goモジュールリファレンスの`require`ディレクティブを参照してください。

構文

require module-path module-version
module-path
モジュールのモジュールパス。通常は、モジュールソースのリポジトリドメインとモジュール名の連結です。モジュールバージョンv2以降では、この値はメジャーバージョン番号で終わる必要があります(例:`/v2`)。
module-version
モジュールのバージョン。リリースバージョン番号(例:v1.2.3)またはGoによって生成された擬似バージョン番号(例:v0.0.0-20200921210052-fa0125251cc4)のいずれかになります。

備考

`go get`などの`go`コマンドを実行すると、Goはインポートされたパッケージを含む各モジュールに対して`require`ディレクティブを挿入します。モジュールがリポジトリでまだタグ付けされていない場合、Goはコマンド実行時に生成する擬似バージョン番号を割り当てます。

`replace`ディレクティブを使用することで、リポジトリ以外の場所からモジュールをGoに要求させることができます。

バージョン番号の詳細については、モジュールのバージョン番号付けを参照してください。

依存関係の管理の詳細については、以下を参照してください。

replace

特定のバージョン(またはすべてのバージョン)のモジュールのコンテンツを、別のモジュールバージョンまたはローカルディレクトリで置き換えます。Goツールは、依存関係を解決する際に置換パスを使用します。

詳細については、Goモジュールリファレンスの`replace`ディレクティブを参照してください。

構文

replace module-path [module-version] => replacement-path [replacement-version]
module-path
置き換えるモジュールのモジュールパス。
module-version
オプション。置き換える特定のバージョン。このバージョン番号を省略すると、モジュールのすべてのバージョンが右側のコンテンツで置き換えられます。
replacement-path
Goが要求されたモジュールを探すパス。モジュールパス、または置換モジュールに対してローカルなファイルシステム上のディレクトリへのパスになります。モジュールパスである場合、`replacement-version`値を指定する必要があります。ローカルパスである場合、`replacement-version`値を使用することはできません。
replacement-version
置換モジュールのバージョン。`replacement-path`がモジュールパス(ローカルディレクトリではない)の場合のみ、置換バージョンを指定できます。

備考

`replace`ディレクティブを使用して、Goにモジュールのソースを見つけるために別のパスを使用させたい場合に、モジュールパスの値を一時的に別の値で置き換えます。これにより、Goによるモジュールの検索が置換先の場所にリダイレクトされます。置換パスを使用するためにパッケージのインポートパスを変更する必要はありません。

`exclude`および`replace`ディレクティブを使用して、現在のモジュールをビルドするときのビルド時の依存関係解決を制御します。これらのディレクティブは、現在のモジュールに依存するモジュールでは無視されます。

`replace`ディレクティブは、次のような状況で役立ちます。

`replace`ディレクティブだけでは、モジュールをモジュールグラフに追加しません。`require`ディレクティブも、メインモジュールの`go.mod`ファイルまたは依存関係の`go.mod`ファイルのいずれかで、置き換えられたモジュールバージョンを参照する必要があります。置き換える特定のバージョンがない場合は、以下の例のように偽のバージョンを使用できます。ただし、`replace`ディレクティブはメインモジュールでのみ適用されるため、あなたのモジュールに依存するモジュールは動作しなくなります。

require example.com/mod v0.0.0-replace

replace example.com/mod v0.0.0-replace => ./mod

必要なモジュールの置き換えの詳細(Goツールを使用して変更を行う方法を含む)については、以下を参照してください。

バージョン番号の詳細については、モジュールのバージョン番号付けを参照してください。

exclude

現在のモジュールの依存関係グラフから除外するモジュールまたはモジュールバージョンを指定します。

詳細については、Goモジュールリファレンスの`exclude`ディレクティブを参照してください。

構文

exclude module-path module-version
module-path
除外するモジュールのモジュールパス。
module-version
除外する特定のバージョン。

備考

`exclude`ディレクティブを使用して、間接的に必要とされるものの、何らかの理由でロードできないモジュールの特定のバージョンを除外します。たとえば、チェックサムが無効なモジュールのバージョンを除外するために使用できます。

`exclude`および`replace`ディレクティブを使用して、現在のモジュール(ビルドしているメインモジュール)をビルドするときのビルド時の依存関係解決を制御します。これらのディレクティブは、現在のモジュールに依存するモジュールでは無視されます。

次の例のように、`go mod edit`コマンドを使用してモジュールを除外できます。

go mod edit -exclude=example.com/theirmodule@v1.3.0

バージョン番号の詳細については、モジュールのバージョン番号付けを参照してください。

retract

`go.mod`で定義されたモジュールのバージョンまたはバージョンの範囲が依存関係として使用されないことを示します。`retract`ディレクティブは、バージョンが時期尚早に公開された場合、またはバージョンが公開された後に重大な問題が発見された場合に役立ちます。

詳細については、Goモジュールリファレンスの`retract`ディレクティブを参照してください。

構文

retract version // rationale
retract [version-low,version-high] // rationale
version
リトラクトする単一のバージョン。
version-low
リトラクトするバージョンの範囲の下限。
version-high
リトラクトするバージョンの範囲の上限。`version-low`と`version-high`の両方が範囲に含まれます。
rationale
リトラクトの説明を説明するオプションのコメント。ユーザーへのメッセージに表示される場合があります。

備考

`retract`ディレクティブを使用して、以前のバージョンのモジュールを使用しないことを示します。ユーザーは`go get`、`go mod tidy`、その他のコマンドでリトラクトされたバージョンに自動的にアップグレードしません。ユーザーは`go list -m -u`でリトラクトされたバージョンを利用可能なアップデートとして表示しません。

リトラクトされたバージョンは、既に依存しているユーザーがパッケージをビルドできるように、利用可能な状態にしておく必要があります。リトラクトされたバージョンがソースリポジトリから削除されても、proxy.golang.orgなどのミラーで利用可能な場合があります。リトラクトされたバージョンに依存するユーザーは、関連モジュールで`go get`または`go list -m -u`を実行すると通知される場合があります。

`go`コマンドは、モジュールの最新バージョンにある`go.mod`ファイルの`retract`ディレクティブを読み取ることで、リトラクトされたバージョンを検出します。最新バージョンとは、優先順位順に次のとおりです。

  1. 存在する場合、その最高のリリースバージョン
  2. 存在する場合、その最高のプレリリースバージョン
  3. リポジトリのデフォルトブランチの先端に対する擬似バージョン。

リトラクトを追加する場合、ほとんどの場合、コマンドがモジュールの最新バージョンでそれを参照できるように、新しい、より高いバージョンをタグ付けする必要があります。

リトラクトを信号として出すための唯一の目的を持つバージョンを公開できます。この場合、新しいバージョンはそれ自体もリトラクトされる場合があります。

たとえば、誤って`v1.0.0`をタグ付けした場合、次のディレクティブを使用して`v1.0.1`をタグ付けできます。

retract v1.0.0 // Published accidentally.
retract v1.0.1 // Contains retraction only.

残念ながら、一度バージョンが公開されると、変更することはできません。後で異なるコミットで`v1.0.0`をタグ付けすると、`go`コマンドは`go.sum`またはチェックサムデータベースで合計値の不一致を検出する可能性があります。

モジュールのリトラクトされたバージョンは通常`go list -m -versions`の出力には表示されませんが、`-retracted`を使用して表示できます。詳細については、Goモジュールリファレンスの`go list -m`を参照してください。