私が歌川です

@utgwkk が書いている

Goファイルの先頭に著作権・ライセンス表記が入っていることを検査するlinterを書いた

表題のものを書きました。どうぞご利用ください。

github.com

使い方

スタンドアロンバイナリ

go installgo 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 コマンドの実行を回避することができません。

github.com

自分が関わっているプロジェクトでも、まだコードベースがそこまで大きくないのにも関わらずgo-headerの実行時間が golangci-lint run --verbose コマンドの実行ログにTop10として表示されるようになっていました。これからコードベースが育っていくにつれて、linterの実行時間が問題になることが考えられます。

年を含まない著作権・ライセンス表記が各Goファイルに入っていることを保証できればよい、という要件に絞れば実装はそこまで難しくないので、さっと作ることにしました。

実装

例によって、Claude Codeに全てを実装してもらいました。自分でも何をやっているのか読める範囲のコードではあるけど、試行錯誤のスピードが段違いなので全て任せてしまうほうが早いですね。

golangci-lintにデフォルトで組み込めるかどうか

go-headerと検査ルールが丸かぶりしている上に機能も足りていないので、すぐには取り込めないんじゃないかな~。自分としてはデフォルトで組み込みたいというモチベーションは今のところないです。それよりは、go-headerのパフォーマンスの問題を解決できるほうがよさそう。

あわせて読みたい

時間のないサイト運営者リング