Slide 1

Slide 1 text

logica X: @logica0419 GitHub: @logica0419 Golangci-lint v2爆誕: 君たちはどうすべきか

Slide 2

Slide 2 text

自己紹介 ● 永見 拓人 (logica) ● 千葉工業大学 情報科学部 情報ネットワーク学科 4年 ● ネットワークコンテンツ研究会 所属 ○ 数人の自宅サーバーをVPNで繋いでクラウド基盤 作ろうとしてます ● Gophers EXプロジェクト主催 ○ 是非皆さんチェックして下さい

Slide 3

Slide 3 text

Gophers EXとは? ● 日本Goコミュニティの海外進出を手助けする取り組み ● EXに込められた意味 ○ Overseas EXpansion (海外進出) ○ EXpress (急行 = 最速で挑戦できる足掛かりを作る) ○ EXperiment (実験的な取り組み)

Slide 4

Slide 4 text

Gophers EXの目標 ● 最終目標 ○ 日本Goコミュニティにおける海外カンファレンス 登壇者を増やす ● 中間目標 ○ 日本Goコミュニティにおける海外カンファレンス 参加者を増やす ○ 日本Goコミュニティから海外に挑戦するプロポーザ ルの量・質を共に高める

Slide 5

Slide 5 text

やっている施策 ● Proposal Challengers (第一回は実施済み) ○ 国際カンファレンスのプロポーザル挑戦を応援 ○ ピアレビュー会や英語話者のレビューを提供 ● COEFL Go-JP ○ 日本国内でのバイリンガル勉強会開催 ○ 多分5月末に第一回を開催します、続報を待て ● 海外カンファレンスツアー ○ 海外カンファレンスに日本人が固まって行く

Slide 6

Slide 6 text

Golangci-lint v2 爆誕

Slide 7

Slide 7 text

2025-03-23 v2.0.0 リリース https://ldez.github.io/blog/2025/03/23/golangci-lint-v2/

Slide 8

Slide 8 text

主な変更内容 - linter ● defaultオプションでベースを選択するように ○ standard / all / none / fast ○ default + enable / disableというシンプルな選択 ■ enable-all / disable-allの混乱が無くなった ● linters-settingsが統合された ○ linterとlinters-settingsが同列な不自然さの改善 ● 設定ファイルの構造変更については、golangci-lint migrateで簡単に対応可能

Slide 9

Slide 9 text

主な変更内容 - relative-path-mode ● ファイルパス関連の処理は、今まで全てgolangci-lint を実行したディレクトリ基準だった ○ 出力に表示されるパスとか、excludeとか ○ この設定はv1の最後で run.relative-path-mode を 使って設定可能になっていた ● v2ではデフォルトが設定ファイル基準に ○ run.relative-path-mode のデフォルト設定が変更 という扱い

Slide 10

Slide 10 text

主な変更内容 - golanci-lint fmt誕生 フォーマッターの宣言的管理 ● 設定ファイルにて、formatterオプションに使うフォー マッターのリストとその設定を記述 ○ linterと同じ感じで設定できる ● golangci-lint fmtで、宣言したフォーマッターを実行 ○ golangci-lint runではフォーマッターは走らない ● 今までリンターでやってたことを、フォーマッターでも やろうというだけ

Slide 11

Slide 11 text

主な変更内容 - 数々のフラグの削除 ● CLIのフラグが新しい形式に移行 ○ 特にoutput周りは大きく変更された ○ excludeに関してはフラグでの設定が不可能に ● このフラグ削除によって、多数のツールが破壊的な影響 を被ることに ○ この後話します

Slide 12

Slide 12 text

これらの変更がrc無しで 一気に新バージョンとして リリースされた 破壊的変更が大量にあったので、移行期間は欲しかった…

Slide 13

Slide 13 text

唐突に破壊されたツール群

Slide 14

Slide 14 text

なぜそのままv2を使えなかったのか ● golangici-lintは設定ファイルをフラグで上書きできる ● 多くのツールでは、パースしやすい出力形式にするため フラグを使って設定を上書きしていた

Slide 15

Slide 15 text

代表的な犠牲者たち ● GoLand

Slide 16

Slide 16 text

代表的な犠牲者たち ● reviewdog / action-golangci-lint ○ こいつはlatestを自動的に使うので更にひどかった

Slide 17

Slide 17 text

代表的な犠牲者たち ● vscode-go (VS Code Go公式拡張機能)

Slide 18

Slide 18 text

という訳で、vscode-goの golangci-lint v2対応を やりました ここからは僕が入れた変更についてのお話

Slide 19

Slide 19 text

extension/src/goLint: adding golangci-lint-v2 to lintTool

Slide 20

Slide 20 text

現在の状況 ● go.lintTool オプションでgolangci-lintを選択すること で使える ● golangci-lintは Go: Install/Update Tools コマンドで インストールできる ○ go installを使ってインストールされる

Slide 21

Slide 21 text

方針 ● 基本的にフラグを入れ替えれば動く ○ golangici-lintのバージョン検知してフラグ出し分け れば良さそう? ● メンテナー: 拡張機能のオプションでv1使うかv2使うか ワークスペースごとに切り替えれるようにしたい ○ lintTool にv2用の新しいオプションを作る ○ v1とv2のバイナリが同居する必要がある

Slide 22

Slide 22 text

最終的な実装内容 ● 新しい installable tool: golangci-lint-v2 ○ 一時ディレクトリにgolangci-lintとしてgo install した後、名前を変えて GO_BIN に移動させる ● 新しい lintToolオプション: golangci-lint-v2 ○ $PATH 内のgolagnci-lint-v2バイナリを実行 ● lintToolオプションの改変: golangci-lint ○ バージョンを検出してフラグを切り替える

Slide 23

Slide 23 text

vscode-go の v0.47.2 で ついにリリースされました! 皆さんぜひお試しを〜 「プレリリースバージョンへの切り替え」で使えます

Slide 24

Slide 24 text

golangci-lintを使っている あなたはどうすべきか

Slide 25

Slide 25 text

ひとまず調べよう ● 使っているツールが対応してるか ○ エディタ / IDE ■ GoLandはまだ対応してません ○ CIツール ○ その他自家製のスクリプトとか ● 対応していなければひとまずv1を使い続けてOK

Slide 26

Slide 26 text

使っているツールが対応していたら ● 手元の golangci-lint を v2 にアップデート ● golangci-lint migrate を実行 ○ 設定ファイルがv2仕様に更新される ● ツール / それらの設定をアップデート ● スクリプト等でフラグを使っているなら、特別な事情が ない限り全て設定ファイルに移行 ○ 必ず対応する項目があるはず ○ golangci-lint run だけで済むように

Slide 27

Slide 27 text

まとめ

Slide 28

Slide 28 text

みんな、golangci-lint v2 使ってくれよな! 今回の一連に関して、golangci-lintのメンテナーと GohperCon UKにプロポーザルを出す予定です、お楽しみに

Slide 29

Slide 29 text

ありがとう ございました Gophers EXに興味あれば ぜひ話しかけて下さい