いやあ、おっしゃる通りだなあ。packageのエコシステムを考えると気にしていかないとだhttps://t.co/JgKigJp564
— k1LoW (@k1LoW) 2024年6月30日
確かに、あまり気にせずgovluncheckに引っ掛かったら即、最新バージョンに上げていたので良くないなあと反省。
というわけで、再発防止ということで作りました*1。
これは何?
指定したgo.modのgoディレクティブのバージョンが最新の1つ前のマイナーバージョンかどうかを確認するツール、もしくはGitHub Actionです。
例えば最新のGoのバージョンが1.22.4だった場合、普通に使用するとgoディレクティブがマイナーバージョン1.21の最新のパッチバージョン(2024年7月1日時点では1.21.11)でないとエラーになります。
$ oldstable Error: version of go directive in go.mod is not latest oldstable (oldstable: 1.21.11, current: 1.22.4)
1.22.4という最新バージョンでもダメで、1.21.10という最新ではないパッチバージョンでもダメです。govulncheckとの併用を想定しているので、厳しめなルールです*2。
ちなみにGitHub Actionとしても提供されていて、次のように書くことでチェックできます。
# .github/workflows/oldstable.yml [...] steps: - name: Check if version of go directive in go.mod is oldstable uses: k1LoW/oldstable@v1 # with: # go-mod-file: go.mod # lax: false
laxモード
「最新バージョンの1つ前のマイナーバージョンの最新のパッチバージョン」が厳しいという人のためにlaxモードも提供しています。
これは、マイナーバージョンだけチェックする形になっています。
チェックルールとしては次のような感じです。
oldstable | go directive | lax mode (--lax ) |
check |
---|---|---|---|
1.21.11 |
1.21.11 |
false |
ok |
1.21.11 |
1.21.6 |
false |
ng |
1.21.11 |
1.22.4 |
false |
ng |
1.21.11 |
1.21 |
false |
ng |
1.21.11 |
1.21.6 |
true |
ok |
1.21.11 |
1.22.4 |
true |
ng |
1.21.11 |
1.21 |
true |
ok |
oldstable
って?
actions/setup-go で使われていたaliasです。stable
が最新バージョンで、oldstable
がその前のマイナーバージョンの最新です。良さげな命名だったので使わせてもらっています。
というわけで
私が管理していて「主にツールではなくライブラリとして使うことを想定しているパッケージ」には随時入れていこうと思います。
こんな感じですね。
すでにgoディレクティブを1.22に上げているものが多いので、1.23のリリースまでお待ちくださいませ。