O hirunewani blog

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

Created at

golangci-lintのソースからのインストールは動作が保証されていません。バイナリをインストールするべきです。

動機

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