go.mod でツールを一元管理 —— tool directive が実現するシンプルな依存管理
こんにちは!ソフトウェアエンジニアの inari111 です。
先日 Go 1.25 がリリースされましたね。
Go 1.25 ではなく、Go 1.24 の話で恐縮ですが、go.mod の tool directive を用いたツール管理 についてご紹介したいと思います。
これまでのツール管理
まず、Go 1.23 までのツール管理について紹介します。
これまでは、go.mod でバージョン管理をしつつ、 tools.go でブランクインポートする方法がありました。
私はこの方針でツール管理をすることが多かったです。
メリットは go.mod で依存関係を管理できることです。
//go:build tools
// tools.go
package tools
import (
_ "github.com/sqlc-dev/sqlc/cmd/sqlc"
)
または、Makefile に直接書いてインストールする方法もあります。
.PHONY: go_install
go_install:
go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest
弊社ではこの方針でツールのバージョンを固定していました。
Go 1.24 からは tool directive が使える
Go 1.24 からは go.mod ファイル内の tool directive を用いてツールの管理ができるようになりました。
使い方は以下のように -tool
を付けて実行します。
go get -tool github.com/sqlc-dev/sqlc/cmd/sqlc@latest
すると、go.mod にはこのように記載されます。
tool (
github.com/sqlc-dev/sqlc/cmd/sqlc
)
利用可能なすべてのツールのリストを見るには、引数なしで go tool を実行します。
go get -tool で入れたツールも表示されていることがわかります。
❯ go tool
addr2line
asm
buildid
cgo
compile
covdata
cover
doc
fix
link
nm
objdump
pack
pprof
preprofile
test2json
trace
vet
github.com/sqlc-dev/sqlc/cmd/sqlc
使うときは go tool ツール名
で実行できます。
❯ go tool sqlc version
v1.29.0
メリット
go.mod で管理するメリットをいくつか挙げます。
-
一元管理ができる
- go.mod 一つでプロジェクトの依存関係とツールを統一的に管理できる
- tools.go ファイルや Makefile での別管理が不要になる
-
バージョン固定と再現性
- ツールのバージョンを明確に指定でき、チーム全体で同じバージョンを使用できる
- CI でも同じバージョンが保証される
-
Go 公式の標準機能
- Go 1.24 から提供される公式機能である
-
go get -tool
コマンドで簡単にインストール可能
-
go mod tidy との統合
- 通常の依存関係と同様に go mod tidy で管理される
- 不要なツールの削除も自動化できる
-
依存関係の明確化
- ツール依存とアプリケーション依存が明確に分離される
- go.mod を見るだけでプロジェクトで使用するツールが一目瞭然
-
Dependabot 等で更新が自動化できる
- Dependabot が go.mod ファイルを解析して自動的に更新 PR を作成
- セキュリティパッチや新機能を含む最新バージョンへの更新が容易に
おわりに
go.mod の tool directive を用いたツール管理についてご紹介しました。
今までの管理方法を続けても問題はありませんが、Go 標準に寄せるほうが私は好みです。
弊社ではバックエンドに Go を使っているので、また Go に関する記事も書いていけたらと思います。
RemitAid では一緒に働く仲間を募集しています。
興味がある方はこちらからどうぞ!
Podcast 「RemiTalk」を最近始めましたので、もし良ければ聴いてみてください!
Podcast 文字起こしはこちら
Discussion