npm version が pre-commit フックで失敗する問題の原因と解決策
npm パッケージのリリース時に np や npm version コマンドを使用していると、pre-commit フックでエラーが発生してリリースプロセスが中断されることがあります。本記事では、その原因と解決策について […]
目次
npm パッケージのリリース時に np や npm version コマンドを使用していると、pre-commit フックでエラーが発生してリリースプロセスが中断されることがあります。本記事では、その原因と解決策について紹介します。
pre-commitでリントエラーが起きたケース
npm run release(内部で np を実行)を実行したとき、以下のようなエラーが発生してバージョン更新が失敗することがあります。
✖ Bumping version
→ Command failed with exit code 1: npm version 0.3.0
今回のケースでは、エラーログを確認すると、pre-commit フックにおける Biome の lint チェックが失敗していました。ログを見ると、package.jsonに対するLintエラーの様子です。
npm error > [email protected] lint
npm error > biome check .
npm error
npm error ./package.json format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
npm error
npm error × Formatter would have printed the following content:
npm error
npm error 14 14 │ }
npm error 15 15 │ },
npm error 16 │ - ··"files":·[
npm error 17 │ - ····"dist",
npm error 18 │ - ····"src"
npm error 19 │ - ··],
npm error 16 │ + ··"files":["dist", "src"],
npm error 20 17 │ "engines": {
npm error 21 18 │ "node": ">=18"
npm error
npm error husky - pre-commit script failed (code 1)
Biome は package.json の files フィールドが1行で記述されることを期待していますが、npm version コマンドが複数行形式で書き込んでいるためフォーマットエラーが発生しています。
npm versionとBiomeの衝突が原因
npm versionがpacakge.jsonを更新します。その際の変更がBiome側の期待するフォーマットと一致していない場合、npm version直後はBiomeによるLintがfailやすくなります。そしてこのケースでpre-commitフックにLintを含めている場合、この問題が原因でnpm versionによるバージョン変更のコミットがfailするということでした。
Lintでfailしないようにする
pre-commit フックを修正し、フォーマットを自動修正してから lint チェックを実行するように変更します。
修正前の設定は以下の通りです。
npm run lint
これを以下のように変更します。
npm run format && npm run lint
この修正によって何が変わるでしょうか。npm version がフォーマットに合わない形式で package.json を書き込んでも、pre-commit フックで npm run format が実行されて自動的にフォーマットが修正されます。その後 npm run lint が実行されエラーなく通過するため、コミットが成功して npm version も正常に完了します。
動作確認
修正後、npm version patch --dry-run を実行すると正常に動作することを確認できます。
$ npm version patch --dry-run
v0.1.2
pre-commit フックも正常に通過し、フォーマットが自動修正されていることが確認できました。
まとめ
npm version が pre-commit フックで失敗する問題は、npm version が Biome のフォーマットルールに合わない形式で package.json を書き込むことが原因でした。pre-commit フックで lint チェックを実行する前にフォーマットを自動修正するよう設定を変更することで、この問題を解決できます。
この修正により、npm version や np を使用したリリースプロセスが正常に動作するようになります。