はじめに
プロダクト開発を行う際に、Go製のコマンドラインツールを使う場合、セットアップやバージョン管理をどのように行っているでしょうか?
個人的には、Makefileにインストール用のコマンドを定義することが多いのですが、Go 1.24で追加された tool directive を使うことで、 go.mod で管理することができるようになりましたので、このやり方を試してみます。
これまでのツールの管理方法
Go 1.23以前のツールの管理では、先程挙げたMakefileを使う方法や、Go Wikiで紹介されている
tools.go
に定義する方法などでツールのセットアップを行うことが多いのではないでしょうか。
これらの管理方法の場合、セットアップのためにコマンドを別途実行する必要があったり、
tools.go
がすでに存在している場合の考慮などが必要でした。
それが、
go mod tidy
コマンドだけでツールも含めたイントールが可能になったので、開発体験が向上するかもしれません。
tool directiveを使ってツールを管理する
Go 1.24から新たに tool directive が
go.mod
に追加されました。
ツールを追加する場合は、
go get -tool
コマンドか
go mod edit -tool
コマンドを使って追加を行います。
ツールの追加
試しに、
moq
をインストールしてみます。
1 | % go get -tool github.com/matryer/moq@latest |
このコマンドを実行すると
go.mod
はこの様になりました。
1 2 3 4 5 6 7 8 9 10 11 12 | module go-mod-tools go 1.24.0 tool github.com/matryer/moq require ( github.com/matryer/moq v0.5.3 // indirect golang.org/x/mod v0.23.0 // indirect golang.org/x/sync v0.11.0 // indirect golang.org/x/tools v0.30.0 // indirect ) |
ちなみに、この状態で
go mod tidy
コマンドを実行しても tool directive に追加されたものが削除される事はありません。
ツールの削除
ツールを削除したい場合は、
go get -tool
コマンドか
go mod edit -droptool
コマンドで行います。
1 | % go get -tool github.com/matryer/moq@none |
go.mod
はこの様になりました。
1 2 3 4 5 6 7 8 9 | module go-mod-tools go 1.24.0 require ( golang.org/x/mod v0.23.0 // indirect golang.org/x/sync v0.11.0 // indirect golang.org/x/tools v0.30.0 // indirect ) |
go tool コマンドでツールを実行する
go tool
コマンドでツールを実行することができます。
試しに、先程追加した
moq
を実行してみます。
mock を生成する interface はこちらです。
1 2 3 4 5 6 7 8 | package main func main() { } type Example interface { ExampleFunc(s string) (string, error) } |
こちらのコマンドを実行します。
1 | go tool moq -out example_mock.go . Example |
すると、
example_mock.go
が生成されます。
または、コード上に以下のような記載をして
go:generate
で生成することもできます。
1 | //go:generate go tool moq -out example_mock.go . Example |
さいごに
go.,mod
の tool directive を使ってツールを管理する方法を試してみました。
これによって、ツールも含めたパッケージの管理が
go.mod
で完結できるようになったので、管理がよりシンプルになったのかなと思います。ただし、
go mod tidy
コマンドを実行してもtool directive のパッケージはインストールされなかったので、
go tool
コマンドで実行する必要がある点は注意が必要です。