Go 1.24 の tool ディレクティブを使ってツール管理を改善する!
はじめに
23卒でバックエンドエンジニアをしています。@putcho01 です。普段の業務では新規サービスのバックエンドおよびインフラの設計・開発を担当しており、主にGo言語を活用しています。
2025年2月11日にリリースされたGo 1.24では、ツールディレクティブ(tool directive) が導入されました。これにより、Go製CLIツールの管理を簡潔にできるようになりました。
本記事では、Go 1.24のリリースされたツールディレクティブの詳細とその活用方法、従来の手法との比較について紹介します。
ツールディレクティブとは?
背景
Go で書かれたプログラムは、多くの場合、Go で書かれたツールを使用して開発されます。
GoではCLIツールを簡単に作成でき、go install
コマンドを使うとソースコードからビルドしたバイナリを簡単にホスト上にインストールすることができます。
例としては、golang.org/x/tools/cmd/stringer などがあります。
CLIツールは、チームの開発メンバー全員が同じバージョンのツールを使用することが望ましいです。バージョンが異なる場合、リンターやコード生成などのツールで差分が発生する可能性があります。
これに対するこれまで推奨されていたアプローチとしては、tools.go
ファイルを作成し、ブランクインポートする方法が一般的でした。
# tools.go
package tools
# バージョン管理したいツールの実行パッケージをブランクインポート
import (
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
...
)
しかし、この方法には次のような問題がありました。
-
tools.go
を適切に管理する必要がある- tools.go ファイルがすでに存在している場合のハンドリング
- 実行時に go run golang.org/x/tools/cmd/stringer とタイプするのは大変なので、プロジェクトにはラッパー・スクリプトが含まれていることが多い。
そこで、Go 1.24ではgo.mod
内でCLIツールの依存関係を明示的に管理できる ツールディレクティブ が導入されました。
使い方
ツールディレクティブを利用すると、以下のように go.mod
に直接記録できます。
ツールの追加
$ go get -tool golang.org/x/tools/cmd/stringer
すると、go.mod
に次のようなエントリが追加されます。
tool golang.org/x/tools/cmd/stringer
ツールの実行
$ go tool stringer
ツールの一覧表示
$ go tool
ツールの更新
$ go get -u tool
このように、go.mod
に記録されたツールを簡単に管理できるようになりました。
従来の手法との比較
ツールディレクティブ (Go 1.24) | 従来の手法 (tools.go & go install ) |
|
---|---|---|
管理方法 |
go.mod にツールを記録 |
tools.go を手動管理 |
依存関係の一元管理 | 可能 | 不可能(go install で追加したツールは記録されない) |
実行方法 |
go tool コマンドで簡単に実行 |
go run や go install の手間が必要 |
バージョン管理 |
go.mod で明確に指定可能 |
go install では手動管理が必要 |
このように、ツールディレクティブを使うことで、Go製CLIツールの管理がシンプルで確実になるメリットがあります。
実際に使ってみた
実際に、tools.go で管理していた ogen を ツールディレクティブを使って管理してみます。
1. go get -tool
go get -tool github.com/ogen-go/ogen/cmd/ogen
go.modに記録されました。
# go.mod
...
go 1.24
require (
...
// 依存パッケージのバージョン記録
github.com/ogen-go/ogen v1.64.5
)
// ツールディレクティブの追加
tool github.com/ogen-go/ogen/cmd/ogen
2. go tool コマンドで実行するようにする
+ //go:generate go tool ogen --target ./ -package hoge --clean openapi.yaml
- //go:generate go run github.com/ogen-go/ogen/cmd/ogen --target ./ -package hoge --clean openapi.yaml
最後に
Go 1.24で導入されたツールディレクティブにより、CLIツールの依存関係を go.mod
で一元管理できるようになり、これまでの煩雑な管理が不要になりました。
Go 1.24を利用している方は、ぜひこの新機能を試して、より快適な開発環境を構築してみてください!
Discussion