メインコンテンツにスキップ
モジュール 9 · レッスン 4 / 5コース内の 44/50~12 min
モジュールのレッスン (4/5)

Goモジュール

Go モジュール は、1 つ以上のパッケージで構成されるバージョン管理可能なユニットです。これは、最新の依存関係システム (Go 1.11 以降) の基盤です。GOPATH も必須の vendor もなくなり、明示的で再現可能な依存関係になります。

go.mod: モジュールマニフェスト

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

3 つの主要なディレクティブ:

  • module <path> — モジュールのインポート パス。すべての内部パッケージは example.com/myapp/sub/pkg としてインポートされます。実際の URL である必要はありませんが、go get 経由で公開するには解決する必要があります。
  • go <version> — 必要な Go の最小バージョン (許可される言語機能を制御するためにも使用されます (1.23 の range-over-func など))。
  • require — 直接の依存関係とその正確なバージョン。

その他のディレクティブ: replace (dep をフォークまたはローカル パスに置き換えます)、exclude、retract。

go.sum: 暗号化ロックファイル

go.mod とともに、go.sum には、ダウンロードされたすべてのバージョンの暗号化ハッシュ (推移的な依存関係を含む) が含まれています。 再現性 が保証されています。誰かが公開バージョンを改ざんすると、ビルドは失敗します。

常にコミットしてください。 go コマンドによって自動的に更新されます。

必須のコマンド

Bash
go mod init example.com/myapp        # create go.mod
go get github.com/google/uuid        # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./...                      # upgrade every dep
go mod tidy                          # remove unused deps, add missing ones
go mod download                      # download everything into the cache
go mod why github.com/x/y            # explain why a dep is included
go mod graph                         # full dependency graph

go mod tidy は、*インポートを変更するたびに**実行するものです。これにより、go.mod が実際に使用されるパッケージを正確に反映することが保証されます。

セマンティック インポート バージョニング (SIV)

バージョンは SemVer: v1.2.3 = MAJOR.MINOR.PATCH に従います。興味深い部分は メジャー v2+ です。

  • メジャー v0 および v1 → 通常のパス: github.com/foo/bar。
  • メジャー v2 以降 → パス メジャー バージョンが含まれます: github.com/foo/bar/v2。
Go
import "github.com/foo/bar/v2"

これにより、同じライブラリの v1 と v2 の両方を同時にインポートできます (段階的な移行中に便利です)。

パスと内部パッケージをインポートする

モジュールが example.com/myapp の場合、utils/ サブフォルダーは次のようにインポートされます。

Go
import "example.com/myapp/utils"

パスは、ディスク上の場所ではなく、go.mod で宣言された名前のみに依存します。別のフォルダーにある同じコードは動作し続けます。

ワークスペースモード (Go 1.18+)

同時に相互参照する複数のモジュール (ライブラリとそれを使用するアプリなど) を操作するには:

Bash
go work init ./lib ./app

これにより、go.work が作成されます。go build は、公開されたバージョンをダウンロードする代わりに、ローカル バージョンの ./lib を使用します。 go.work はコミットしないでください (開発環境です)。

演習

運動#go.m9.l4.e1
試行回数: 0読み込み中…

モジュールは example.com/myapp で、utils サブフォルダーが含まれています。フルパスを使用してメインにサブパッケージをインポートします。

エディターを読み込み中…
ヒントを表示

インポート パスは、モジュール名 (go.mod から) にフォルダーの相対パスを加えたものです。

3 回の試行後に解決策が利用可能になります

運動#go.m9.l4.e2
試行回数: 0読み込み中…

import ( ... ) 構文を使用して、個々のインポートをインポート グループに変換し、fmt と os の両方をインポートします。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

Quiz#go.m9.l4.e3
準備完了

go.mod からインポートされなくなった依存関係を削除し、不足している依存関係を追加するコマンドはどれですか?

Go
$ go mod ???
回答の選択肢