表題のものを書きました。どうぞご利用ください。
使い方
スタンドアロンバイナリ
go install や go tool コマンドなどで落としてきて直接使う方法です。-header オプションに必要な表記を文字列で渡して使います。-fix オプションを渡すことで自動修正できます。
% copyrightheader -header='Copyright (c) Your Name' ./...
go vet コマンド経由
go vet コマンドの -vettool オプション経由で使うことができます。
% go vet -vettool=$(which copyrightheader) -copyrightheader.header='Copyright (c) Your Name' ./...
golangci-lintのカスタムlinter
golangci-lintのModule Plugin Systemの仕組みを使うことで、カスタムlinterとして組み込んで動作させることができます。
plugins: - module: github.com/utgwkk/copyrightheader import: github.com/utgwkk/copyrightheader/plugin
設定項目はこういう感じで書けます。
linters: enable: - copyrightheader settings: custom: copyrightheader: type: module settings: header: 'Copyright (c) Your Name'
動機
Goファイル先頭のコメントの内容を検査するlinterとしては、すでにgo-headerが存在し、golangci-lintにデフォルトで組み込まれています。また、go-headerのほうが設定項目も機能も多いので、普通にgo-headerを使ったほうがいいんじゃないか、と思われるでしょう。
go-headerにはパフォーマンスの問題があります。既にissueで報告されているように、検査するファイルごとに git コマンドを実行しているため、ファイル数が多くなるとlinterの実行時間がどんどん長くなってしまいます。著作権表記のテンプレートに年を入れない場合でも git コマンドの実行を回避することができません。
自分が関わっているプロジェクトでも、まだコードベースがそこまで大きくないのにも関わらずgo-headerの実行時間が golangci-lint run --verbose コマンドの実行ログにTop10として表示されるようになっていました。これからコードベースが育っていくにつれて、linterの実行時間が問題になることが考えられます。
年を含まない著作権・ライセンス表記が各Goファイルに入っていることを保証できればよい、という要件に絞れば実装はそこまで難しくないので、さっと作ることにしました。
実装
例によって、Claude Codeに全てを実装してもらいました。自分でも何をやっているのか読める範囲のコードではあるけど、試行錯誤のスピードが段違いなので全て任せてしまうほうが早いですね。
golangci-lintにデフォルトで組み込めるかどうか
go-headerと検査ルールが丸かぶりしている上に機能も足りていないので、すぐには取り込めないんじゃないかな~。自分としてはデフォルトで組み込みたいというモチベーションは今のところないです。それよりは、go-headerのパフォーマンスの問題を解決できるほうがよさそう。