目次

  • はじめに
  • 対象読者
  • Go 1.24の変更内容
  • 期待の「ツールディレクティブ」
  • 終わりに

はじめに

AmebaLIFE事業本部でバックエンドエンジニアをしています、23新卒のみねしんです。

普段はGo言語を主に使って開発をしています。

本記事の内容

Go 1.24が2025年2月11日にリリースされました。

Go製CLIツールの管理が楽になる機能が搭載されているということで個人的に気になっていたリリースだったため本記事ではGo 1.24の変更内容を紹介しつつ、CLIツールの管理方法がどのように変わったかご紹介できればと思います。

対象読者

  • これまでGo製CLIツールのバージョン管理方法で悩んでいた方

Go1.24の変更内容

詳しくはGoの公式リリースノートをご参照いただければと思いますが、簡単にGo 1.24における変更内容の一部をご紹介いたします。

言語の変更

  • ジェネリック型エイリアスの完全なサポート

パフォーマンスの改善

  • ランタイムに改善によりCPUオーバーヘッドが平均2~3%削減

ツールの改善

  • ツールディレクティブの追加 ← 今回の注目機能!
  • アナライザーの改修

標準ライブラリの追加

  • 暗号化関連機能の改修
  • ベンチマークテストの改修
  • ファイルシステムアクセスの改修
  • ランタイムのファイナライズメカニズムの改修

WebAssemblyサポートの改善

  • WASM向けのビルドのための新しいディレクティブの追加

 

などなど…!

期待の「ツールディレクティブ」

背景

Goは、Go 1.16より独自のモジュールシステム「Go Modules」を備えています。

こちらを用いると、go.modに依存パッケージのバージョンを記録することでパッケージのバージョン管理が可能です。

go mod tidy コマンドを使用すると自動でプロジェクト内の依存関係を整理・記録してくれる点も非常に便利です。

なお、go.modに依存パッケージとして記録される対象はプロジェクト内のソースコードでimportされているパッケージです。

 

今回導入されたツールディレクティブでは、こちらの「Go Modules」でGo製CLIツールのバージョン管理が簡単に行えるようになりました。

GoではCLIツールを簡単に作成でき、go install コマンドを使うとソースコードからビルドしたバイナリを簡単にホスト上にインストールすることができます。

こうしたGo製CLIツールも更新により破壊的変更が生じる場合があるので、他のパッケージと同様にバージョン管理できると便利ですが、Go 1.24ではややトリッキーな対応が必要でした。

これまでのツール管理

Go製CLIツールのバージョン管理を行う方法の一つとして、従来はツールの実行用パッケージをブランクインポートしたファイルを作成する方法が利用されていました。

# tools.go

package tools

# バージョン管理したいツールの実行パッケージをブランクインポート
import (
  _ "github.com/golangci/golangci-lint/cmd/golangci-lint"
  ...
)

このようなファイルを作成した状態で、go mod tidy を実行することで依存パッケージとして認識されgo.modにバージョンを記録することができます

(この状態でgo install をバージョン指定なしに実行するとgo.modに記載されたバージョンがインストールされる)。

# go.mod

...

go 1.23

require github.com/golangci/golangci-lint v1.63.4

require (
	...
)

しかしながら、この方法には以下のような課題が存在しました。

  • 管理するファイルが増える
  • 実行用のパッケージのインポートが静的解析ツールの警告にひっかかる(下記画像)
従来の管理方法の場合のgo.modの画像
従来の管理方法の場合のgo.mod

これからのツール管理

今回、Go 1.24で導入されたツールディレクティブを使用するとこれまでの管理方法の煩雑さを改善することができます(tools.goなどでインポートする必要がなくなる)。

Go 1.24 でのツール管理の方法は以下の通りです。

  1. go get -tool <ツールの実行パッケージ> でバージョン管理したいツールを取得 → go.modのtoolディレクティブにパッケージが記録される
  2. go tool <ツール名> でツールを実行

実際に、一連の流れを試してみたいと思います。

今回は、golangci-lintをインストールしてみます。

-tool オプション付きでgo get

go get -tool github.com/golangci/golangci-lint/cmd/golangci-lint

go.modに、バージョンが記録されました。

# go.mod

...

go 1.24

require (
  ...
  // 依存パッケージのバージョンが記録されている
  github.com/golangci/golangci-lint v1.64.5 // indirect
  ...
)

// ツールディレクティブが追加された
tool github.com/golangci/golangci-lint/cmd/golangci-lint

go tool で実行してみる

事前準備として、lint対象として以下のファイルを追加しています。

# main.go

package main

import "fmt"

func main() {
  // fmtの使用に関する警告が発生する(forbidigo)
  fmt.Println("Hello, World!")
}

コマンドを実行してみます。

go tool golangc-lint run main.go

golangci-lintをgo tool経由で起動することができました。

go tool経由でのgolangci-lintの実行結の画像
go tool経由でのgolangci-lintの実行結果

その他、以下のようなコマンドも利用できるようです。

  • go tool … 管理しているツールの一覧を表示
  • go get -u tool  … 管理しているツールの一括アップグレード

終わりに

今回は、Go 1.24で追加されたツールディレクティブの機能を試してみました。

軽く試した限りの所感ですが、従来のGo製CLIツールの管理方法の煩雑さが解消されとても使いやすくなった印象です。

もう少し使用感を試してみて問題がなければ、実際のプロジェクトで使用しているツール管理も新しい形式に切り替えていきたいと思います。

皆様もGo 1.24でのツール管理、ぜひお試しいただければと思います。

 

それではご覧いただきましたありがとうございました!

 


 

AmebaLIFE事業本部(4/1からは株式会社AmebaLIFE !!)では、オウンドメディア「Ameヨコ」も展開しております。

AmebaLIFEでの働き方や開発組織についてのコンテンツが充実しておりますので、AmebaLIFEにご興味をお持ちいただけた方はぜひそちらもご覧いただけますと幸いです。

アバター画像
2023年新卒入社のバックエンドエンジニアです。AmebaLIFE事業本部の開発局/新規事業準備室兼務。 好きなものはゲーム, MtG, ジビエなどなど。 Developers Blogの運営など、広報的な業務も担当しています!