goheader

Table of Contents

  1. 解決する問題
  2. 設定
  3. オプション
    1. ビルトインテンプレート変数
  4. サンプル
    1. 検出例
    2. 修正例
    3. 正規表現を使った柔軟なマッチング
  5. 注意点
  6. 参考リンク

goheader はソースファイルの先頭にある著作権ヘッダーがテンプレートと一致するかをチェックするツールです。

解決する問題

企業やオープンソースプロジェクトでは、すべてのソースファイルにライセンスヘッダーを記載する必要があります。ファイル数が増えるとヘッダーの付け忘れやフォーマットの不一致が発生しやすくなります。

1
2
3
4
5
6
7
8
9
// Before: ヘッダーがない、または形式が不統一

package main

import "fmt"

func main() {
fmt.Println("hello")
}
1
2
3
4
5
6
7
8
9
10
11
12
// After: 統一されたヘッダーを付与

// Copyright 2025 MyCompany
// SPDX-License-Identifier: Apache-2.0

package main

import "fmt"

func main() {
fmt.Println("hello")
}

設定

公式ドキュメント

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# .golangci.yml 設定例
version: "2"

linters:
enable:
- goheader
settings:
goheader:
values:
const:
COMPANY: MyCompany
LICENSE: Apache-2.0
template: |-
Copyright {{ YEAR }} {{ COMPANY }}
SPDX-License-Identifier: {{ LICENSE }}

オプション

オプション デフォルト 説明
template string "" ヘッダーのテンプレート文字列
template-path string "" テンプレートファイルのパス(template と排他)
values.const map[string]string {} テンプレート内で使用する固定値
values.regexp map[string]string {} テンプレート内で使用する正規表現パターン

ビルトインテンプレート変数

変数 説明
{{ YEAR }} 現在の年 2025
{{ YEAR-RANGE }} 年の範囲 2020-2025

サンプル

検出例

1
2
3
4
5
6
// goheader が警告: header does not match template

// Copyright 2024 MyCompany ← 年が古い
// MIT License ← テンプレートと不一致

package user

修正例

1
2
3
4
// Copyright 2025 MyCompany
// SPDX-License-Identifier: Apache-2.0

package user

正規表現を使った柔軟なマッチング

1
2
3
4
5
6
7
8
9
10
11
12
# 年の範囲を許容する設定
linters:
settings:
goheader:
values:
const:
COMPANY: MyCompany
regexp:
YEAR_PATTERN: 20[2-9]\d(-20[2-9]\d)?
template: |-
Copyright {{ YEAR_PATTERN }} {{ COMPANY }}
SPDX-License-Identifier: Apache-2.0

この設定で Copyright 2023 MyCompanyCopyright 2023-2025 MyCompany のいずれも受け入れられます。

注意点

  • templatetemplate-path は排他的。両方指定するとエラーになる
  • 生成されたファイル(*.pb.go 等)は issues.exclude-rules でパスを除外するとよい
  • values.constvalues.regexp はテンプレート内で {{ KEY }} として参照できる。再帰的な参照も可能

参考リンク