コンテンツにスキップ

Go/go.work

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

go.work は、Go 1.18 で追加された ワークスペースモード の設定ファイルです。 簡単に言うと、複数の go.mod(モジュール)を 1 つの開発単位としてまとめるための仕組みです。

目的

[編集]
  • 大規模プロジェクトやモノレポ(monorepo)のように、複数の Go モジュールを同時に開発するとき、
    • 依存モジュールを ローカルの修正版 に差し替える
    • replace をたくさん書くという手間を減らすために導入されました。

基本構造

[編集]
go 1.22

use (
    ./app
    ./lib
)
  • go
    ワークスペースで使う Go のバージョン。
  • use
    各モジュールのパス(相対パス or 絶対パス)を指定。
    ここで指定したパスのディレクトリには それぞれ go.mod がある必要 があります。

動作イメージ

[編集]

go.work があると、Go ツールチェーンは 「モジュールの依存解決時に、go.workuse で指定されたローカルモジュールを優先する」 ようになります。

# 構成
/go.work
/app/go.mod  ← module example.com/app
/lib/go.mod  ← module example.com/lib

もし /app/go.modrequire example.com/lib v1.0.0 を指定していても、 ワークスペースモードでは ./lib が優先され、ローカルの最新版が使われます。

利点

[編集]
  • replace を大量に書かなくてもローカル開発できる。
  • モジュールごとの独立性は維持しつつ、一括でビルド・テストできる。
  • go test ./... で全モジュールを一気にテスト可能。

主なコマンド

[編集]
作成
go work init ./app ./lib
go.work が生成される。
モジュール追加
go work use ./newmodule
モジュール削除
go work edit -dropuse ./lib

注意点

[編集]
  • go.work開発用の設定ファイル なので、基本的に配布バイナリや本番ビルドには不要。
  • Go 1.18 以降でのみ有効。
  • go.work.sum という依存のハッシュファイルも生成されます(go.sum と同じ役割のワークスペース版)。