モジュールのレッスン (4/5)
Goモジュール
Go モジュール は、1 つ以上のパッケージで構成されるバージョン管理可能なユニットです。これは、最新の依存関係システム (Go 1.11 以降) の基盤です。GOPATH も必須の vendor もなくなり、明示的で再現可能な依存関係になります。
go.mod: モジュールマニフェスト
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 コマンドによって自動的に更新されます。
必須のコマンド
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 graphgo 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。
import "github.com/foo/bar/v2"これにより、同じライブラリの v1 と v2 の両方を同時にインポートできます (段階的な移行中に便利です)。
パスと内部パッケージをインポートする
モジュールが example.com/myapp の場合、utils/ サブフォルダーは次のようにインポートされます。
import "example.com/myapp/utils"パスは、ディスク上の場所ではなく、go.mod で宣言された名前のみに依存します。別のフォルダーにある同じコードは動作し続けます。
ワークスペースモード (Go 1.18+)
同時に相互参照する複数のモジュール (ライブラリとそれを使用するアプリなど) を操作するには:
go work init ./lib ./appこれにより、go.work が作成されます。go build は、公開されたバージョンをダウンロードする代わりに、ローカル バージョンの ./lib を使用します。 go.work はコミットしないでください (開発環境です)。
演習
モジュールは example.com/myapp で、utils サブフォルダーが含まれています。フルパスを使用してメインにサブパッケージをインポートします。
ヒントを表示
インポート パスは、モジュール名 (go.mod から) にフォルダーの相対パスを加えたものです。
3 回の試行後に解決策が利用可能になります
import ( ... ) 構文を使用して、個々のインポートをインポート グループに変換し、fmt と os の両方をインポートします。
3 回の試行後に解決策が利用可能になります
go.mod からインポートされなくなった依存関係を削除し、不足している依存関係を追加するコマンドはどれですか?
$ go mod ???