👌

Go 1.24 の tool ディレクティブを使ってツール管理を改善する!

2025/02/28に公開

はじめに

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 rungo 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 コマンドで実行するようにする

pkg/hoge/generator.go
+ //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