717 文字
4 分

golangci-lintをgo toolでインストールすべきでない

動機#

Go v1.24 で追加されたgo toolコマンドを利用して golangci-lint のインストールを行っている記事がいくつか見られます。

しかし、Go v1.24 以前でもgo toolの代替となる blank import を利用した tools.go ファイルを用意する手法(tool pattern)がありましたが、 多くの方はバイナリインストールを行っていたと思います。

私個人も以前 golangci-lint を tools.go から blank import しない選択をしています。go toolでも本質的には tools.go と変わらない認識なので、当時この選択をした懸念点は解消されていないと思いますが、念のため再度調べることにしました。

非推奨のインストール方法である#

そもそも golangci-lint 公式は、以前からバイナリインストール方法を推奨しています。

より正確に言うのであれば、 go install/go get などを利用したインストールの動作を保証しておらず非推奨としています。 久しぶりにドキュメント見ると、次のように tools pattern と go tool コマンドも明示的に動作を保証しないと書かれていました。

Using go install/go get, “tools pattern”, and tool command/directives installations aren’t guaranteed to work.

https://golangci-lint.run/welcome/install/#install-from-sources

これらのインストールが非推奨である詳しい理由などは引用箇所の下に書かれています。またバイナリインストールよりも遅いということも明示されています。

依存関係が非常に多い#

まず依存関係が多いほどインストールに掛かる時間とコストは増加します。

加えて、Go、特に golangci-lint のようなツールでは、他の依存関係の更新により本来の依存関係が影響を受けて意図しない挙動をする可能性があります。 これは golangci-lint が非推奨としている理由の一部でもあります。

また、管理体制に拠りますが、多い依存関係によって頻繁なアップデートが必要になってしまう可能性もあります。

結論#

Go v1.24 でも、golangci-lint はバイナリでインストールすべきであり、go toolコマンドなどでインストールするべきではありません。

余談:workspace もおすすめしない#

golangci-lint を go tool コマンドでインストールする記事を見ていると、依存関係が多いという理由から Go の workspace 機能を使って依存関係を切り出しているものを見つけました。

ですが、現在 workspace には次のバグがあるため、おすすめしません。

https://github.com/golang/go/issues/50750

-eオプションを付けるというワークアラウンドが紹介されていますが、これはエラーが発生しても続行するというものなので、やはりおすすめしません。

golangci-lintをgo toolでインストールすべきでない
https://blog.ohirunewani.com/posts/go-concerns-about-installing-golangci-lint-using-go-tool/
作者
hrdtbs
公開日
2025-03-15
ライセンス
CC BY-NC-SA 4.0