RemitAid Tech Blog
📦

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 で管理するメリットをいくつか挙げます。

  1. 一元管理ができる

    • go.mod 一つでプロジェクトの依存関係とツールを統一的に管理できる
    • tools.go ファイルや Makefile での別管理が不要になる
  2. バージョン固定と再現性

    • ツールのバージョンを明確に指定でき、チーム全体で同じバージョンを使用できる
    • CI でも同じバージョンが保証される
  3. Go 公式の標準機能

    • Go 1.24 から提供される公式機能である
    • go get -tool コマンドで簡単にインストール可能
  4. go mod tidy との統合

    • 通常の依存関係と同様に go mod tidy で管理される
    • 不要なツールの削除も自動化できる
  5. 依存関係の明確化

    • ツール依存とアプリケーション依存が明確に分離される
    • go.mod を見るだけでプロジェクトで使用するツールが一目瞭然
  6. Dependabot 等で更新が自動化できる

    • Dependabot が go.mod ファイルを解析して自動的に更新 PR を作成
    • セキュリティパッチや新機能を含む最新バージョンへの更新が容易に

おわりに

go.mod の tool directive を用いたツール管理についてご紹介しました。
今までの管理方法を続けても問題はありませんが、Go 標準に寄せるほうが私は好みです。

弊社ではバックエンドに Go を使っているので、また Go に関する記事も書いていけたらと思います。

RemitAid では一緒に働く仲間を募集しています。
興味がある方はこちらからどうぞ!

https://youtrust.jp/recruitment_posts/fca1654630a5be7d404f275c537e9e2c

https://youtrust.jp/recruitment_posts/dab930db9b573452241f0d9b6ea8cd29

https://youtrust.jp/recruitment_posts/ad655de82471df86af4f19469fe4c0de

https://youtrust.jp/recruitment_posts/7141d690aaa5ed348de45757da069e81

Podcast 「RemiTalk」を最近始めましたので、もし良ければ聴いてみてください!

https://podcasts.apple.com/jp/podcast/remitalk/id1826516525

Podcast 文字起こしはこちら

https://note.com/remitaid

RemitAid Tech Blog
RemitAid Tech Blog

Discussion