この記事はApplibot Advent Calendar 2024 の12日目の記事です。前回の記事はこちらです。
はじめに
最近初めてgo workを使ったので、go workの使いどころを紹介したいと思います。
go workの存在自体は知っていましたが、実際に使ったことがなかったので備忘録としても残しておきます。
改めて調べてみたらgo workってgo1.18から追加されたんですね。2022年3月くらい?
月日が立つのは早すぎて怖いですね。
結論
結論から書くのが好きなので、結論から書きます!
go workは複数のGoモジュールを一つのワークスペースとして効率的に管理するためのツールで、複数モジュールの依存関係を簡単に扱え、開発がスムーズになるものです!
というのが結論なのですが、まぁこれだけだとなんのことだか分からないと思うので実際に試してみました。
実際に試してみる
色々とテキストで書くよりも、実際にコードをみながら自分で体験するのが一番ということで実際にコードを書いてみます。
以下のようなディレクトリ構造を用意します。
my-go-workspace/
|-- moduleA/
|-- moduleB/
moduleBフォルダ内に以下の内容でGoモジュールを作成します
cd my-go-workspace/moduleB
# Goモジュールの初期化
go mod init moduleB
# ファイル作成
touch b.go
b.goの中身はこんな感じにしておきます。
package moduleB
func HelloB() string {
return "Hello from Module B"
}
次に、moduleAフォルダ内に以下の内容でGoモジュールを作成します:
# moduleAフォルダに移動
cd ../moduleA
# Goモジュールの初期化
go mod init moduleA
# moduleA内のコード
touch main.go
main.goはこのような中身にしておきます。
package main
import (
"fmt"
"example.com/moduleB"
)
func main() {
fmt.Println(moduleB.HelloB())
}
ここまでで準備は完了です。
この段階でmoduleA/main.goを確認するとimportでエラーが起きると思います。
それもそのはずで、moduleBは現在ローカルにしか存在せずgo getすることもできないからです。
そこでgo workの出番です。
# ルートディレクトリにいる状態で下記コマンド実行
go work init moduleA moduleB
すると、下記のファイルが作成されると思います。
go 1.23.2
use (
./moduleA
./moduleB
)
この時点で、先程でていたimportエラーは消えているはずでgo runしても成功すると思います。
go run ./moduleA
どういうことかというと、go.workファイルで指定されているモジュールに限ってローカルモジュールを参照しにいくということです。
この機能を利用すれば、公開はしていないけど先んじてローカルでだけ行った修正を実際に動かすことができるので素早い開発ができます。
go workがない場合は、まずモジュールを修正して、そしてそれを公開して実際に組み込んで初めて動作確認ができると思います。だいぶ手間ですね。
というわけで簡単にgo workの挙動は試せました!
ここからはgo workが登場する前と後でどのようなことが変わったのか調べたのでまとめてみました。
go workが登場する前
複数モジュールの開発
複数のモジュールを同時に編集・ビルド・テストする場合、従来のGoモジュールシステムでは煩雑な手作業が要求されることもありました。
例えば、あるモジュールAが別のモジュールBに依存している場合、モジュールBに変更を加えた上でモジュールAをテストするのが難しい状況が発生していました。
ローカルの依存関係管理
あるモジュールが他のローカルに存在する未公開のモジュールに依存している場合、その依存関係をうまく管理するのが困難でした。
ネットワークを通じて公開されていないローカルのモジュールを利用して開発を進めたいケースに適したツールが求められていました。
go workが登場する後
go workの導入
上記の課題を解決するために、go work 機能は導入されました。
go workは、複数のモジュールを一つのワークスペースとして管理する新しい方法を提供し、よりスムーズな開発体験を実現するための機能です。
複数モジュールの一括管理
複数のモジュールを一つのワークスペースで管理することができ、各モジュールの依存関係やバージョンを一元管理できます。
ローカルモジュールの利用
未公開のローカルモジュールも簡単にワークスペースに組み込み、依存関係として扱うことができます。これにより素早いサイクルでの開発とテストが可能になります。
まとめ
最後にもう一回まとめとして書きますが、go work便利なのでモノレポで複数モジュール開発を行う場合は積極的に使っていきましょう!