はじめに
Go 1.18連載の5本目です。
Go 1.18からGoのマルチモジュール1での開発を便利にするWorkspacesモードが導入されます。Workspacesモードの導入背景はマルチモジュールでの開発体験を改善することです。詳しくはProposal: Multi-Module Workspaces in cmd/goのBackgroundやScopeに記載があります。
Workspacesモードがどのように動作するか知るためには、実際に動かしてみるのがよいでしょう。本記事ではWorkspacesモードを試してみた結果を紹介します。GoのバージョンはGo 1.18 beta2を使っています。
マルチモジュール構成
早速、例として、Workspacesモードが存在しない場合のマルチモジュール構成を考えてみます。
> tree |
- names モジュール
module github.com/d-tsuji/sample-go-workspace/names |
package names |
- tools モジュール
module github.com/d-tsuji/sample-go-workspace/tools |
package main |
マルチモジュール構成で開発している場合、ローカルファイルシステムに存在する依存モジュールを参照するために go.mod ファイルで replace ディレクティブを使って参照することがあります。本例では replace ディレクティブが必要な go.mod ファイルは1つですが、複数のモジュールが依存していると複数のモジュールの go.mod をもれなくメンテナンスする必要があります。マルチモジュール構成の開発で replace ディレクティブに苦しめられたのは私だけではないはずです。
Workspacesモード
さて本題のWorkspacesモードを紹介します。
go work init コマンドでWorkspacesモードの対象とするモジュールのパスを指定して、go.work ファイルを作成します。go.work ファイルが存在すると、go コマンドはWorkspacesモードになります。
> go work init names tools |
ディレクトリ構成は以下です。go.work ファイルが存在することと go.mod に replace ディレクティブが存在しないことが最初に紹介したマルチモジュール構成の例との大きな違いです。
. |
go.work ファイルは go.mod ファイルと同様な形式で記述されるファイルです。go.work ファイルに含まれる use ディレクティブは go.mod ファイルを含む相対パスまたは絶対パスが記述されます。また use ディレクティブにはコメントを書くこともできます。
go 1.18 |
go.mod ファイルには replace ディレクティブは不要です。
module github.com/d-tsuji/sample-go-workspace/tools |
replace ディレクティブなしに use で指定したモジュールの依存を解決できます。以下のように動作を確認できます。
> go run tools\cmd\main.go |
もちろん以下のように go.work ファイルで指定しなかった場合は依存関係を解決できません。
go 1.18 |
go run tools\cmd\main.go |
go work コマンドは init の他に、go.work ファイルを修正する edit コマンドや go.work ファイルにディレクトリを追加する use コマンド、sync コマンドなどいくつかのコマンドがあります。Go Modules Reference にある go work init などに詳しく書いてあります。
goplsでのサポート
今後、goplsにおいてもWorkspacesモードをサポートするProposalもあります。開発ツール含めて、マルチモジュールの開発体験を改善していく動きがあります。go.workファイルはリポジトリにコミットしない慣習
Proposalではgo.workファイルはリポジトリにコミットしないことを推奨しています。go.workファイルによってリポジトリのビルド構成が変更されてしまうため、とあります。github/gitignoreのGoのテンプレートにもgo.workファイルが追加されていました。2
とはいえ、go.work ファイルを共有したいユースケースもありそうなので、このあたりの議論に詳しい方、こっそり教えて下さい。
さいごに
Go 1.18で導入されるWorkspacesモードを試してみました。Workspacesモードを学ぶにあたって、Proposalを書いた本人のデモ動画(Go Workspaces Proposal Demo)なども参考になりました。マルチモジュールの開発体験が向上するWorkspacesモード、リリースが楽しみです。
- 1.マルチモジュールとは、あるリポジトリに複数のモジュールが含まれるようなリポジトリを指し、それぞれのモジュールが
go.modファイルを持ちます。https://github.com/golang/go/wiki/Modules#faqs--multi-module-repositories ↩ - 2.https://github.com/github/gitignore/blob/438cb4af67f3a09c008c5c3f5c1ec325511b8970/Go.gitignore ↩