Huskyのv8の頃の書き方がv9で非推奨になってたので修正してみた
はじめに
リテールアプリ共創部の中野です。
Huskyといえば、lint-stagedというライブラリと組み合わせて、コードのフォーマットやリンターなどの独自に作成したスクリプトをコミット前やプッシュ時に実行してくれるツールです。
v8の頃にHuskyのデフォルトコマンドで作成したpre-commitの書き方が変わっていましたので、置き換える際に調査した内容を記載します。
環境情報
Huskyのバージョン移行前後の環境情報は以下の通りです。
移行前
- npm 10.8.2
- node 20.16.0
- husky 8.0.3
- lint-staged 15.2.0
移行後
- npm 10.8.2
- node 20.16.0
- husky 9.1.4
- lint-staged 15.2.0
package.json
今回はテスト的に以下のようなpackage.jsonを利用してみました。
ステージングされた変更をコミットするときに、npm run sleep
が実行されるようにしています。
スクリプトとしては3秒間停止したあとに、Hello Husky!
を標準出力します。
コミット時にわざと失敗してpre-commitの状況を標準出力で確認できるようにexit 1
で終了しています。
{
"name": "husky-test",
"version": "1.0.0",
"private": true,
"scripts": {
"sleep": "sleep 3 && echo 'Hello Husky!' && exit 1",
"prepare": "husky install"
},
"lint-staged": {
"**/*": [
"bash -c 'npm run sleep'"
]
},
"devDependencies": {
"husky": "{移行前後の特定バージョン}",
"lint-staged": "15.2.0",
},
"engines": {
"node": "20.16.0",
"npm": ">= 10.x"
},
"volta": {
"node": "20.16.0",
"npm": "10.8.2"
}
}
非推奨を確認した経緯
v8の場合
Husky + lint-stagedを利用したprecommitを設定した環境で、以下のような警告メッセージを確認しました。
$ git commit -m "testing pre-commit code"
⚠ Skipping backup because there’s no initial commit yet.
✔ Preparing lint-staged...
⚠ Running tasks for staged files...
❯ package.json — 4 files
❯ **/* — 4 files
✖ bash -c 'npm run sleep' [FAILED]
✔ Applying modifications from tasks...
✖ bash -c 'npm run sleep':
sh: Hello: command not found
> husky-test@1.0.0 sleep
> sleep 3 && Hello Husky!
husky - pre-commit hook exited with code 1 (error)
v9の場合
v9になると、『.husky/pre-commitから以下の2行を削除してください』というメッセージが表示されるようになりました。
なお、v10.0.0からこのコマンドを残したままにすると失敗されるようになるようなメッセージの記述もありました。
git commit -m "testing pre-commit code"
husky - DEPRECATED
Please remove the following two lines from .husky/pre-commit:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
They WILL FAIL in v10.0.0
⚠ Skipping backup because there’s no initial commit yet.
✔ Preparing lint-staged...
⚠ Running tasks for staged files...
❯ package.json — 4 files
❯ **/* — 4 files
✖ bash -c 'npm run sleep' [FAILED]
✔ Applying modifications from tasks...
✖ bash -c 'npm run sleep':
> husky-test@1.0.0 sleep
> sleep 3 && echo 'Hello Husky!' && exit 1
Hello Husky!
husky - pre-commit script failed (code 1)
対処法
pre-commitの書き方
まずは、pre-commitについて非推奨の部分を削除して修正してみました。
以下のv8の部分をv9のようにしてみました。
v8の場合
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
v9の場合
lint-staged
Huskyのv9.1.1のリリースノートを確認すると、pre-commitで指定するコマンドのプレフィックスにnpxが不要になったことで、コミットスクリプトを起動する時間が多少短縮したとのことでした。
上記のリリースノートより引用した内容だと、jestコマンドは0.2秒程度起動が早くなったとのことです。
# .husky/pre-commit
- npx jest
+ jest # ~0.2s faster
セットアップコマンドの修正
さらに、Huskyがv8からv9になると、Huskyを初期セットアップするコマンドが以下のように一行のコマンドですむようになりました。
v8の場合
npm pkg set scripts.prepare="husky install"
npm run prepare
npx husky add .husky/pre-commit "npm test"
v9の場合
npx husky init
このことについては、Huskyのv8.0.3からv9.1.4へアップデートすると、husky install
が非推奨であることをメッセージで警告してくれるようになっていました。
$ npm i
> husky-test@1.0.0 prepare
> husky install
install command is DEPRECATED
changed 1 package, and audited 57 packages in 1s
31 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
調査していて気づいたこと
私の環境では、Huskyをv8.0.3からv9.1.4に一気にひとっとびするようなバージョンアップをおこないました。
一方で、v9.1.1へ指定してバージョンアップした際に、自動的に.husky/pre-commit
の非推奨の箇所(#!/usr/bin/env sh
や . "$(dirname -- "$0")/_/husky.sh
)を削除してくれることを確認しました。
実際にv9.1.1を指定して、npm install
すると非推奨部分が自動削除されました。
$ npm i
> husky-test@1.0.0 prepare
> husky install
install command is DEPRECATED
husky - removed deprecated code from .husky/pre-commit
changed 1 package, and audited 57 packages in 795ms
31 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
さらに気になって、v9.1.2以降のバージョンを指定してバージョンアップすると非推奨の箇所は自動削除されずに、メッセージのみ表示されました。
これは、Huskyの制作元のtypicodeさんの判断で一旦メッセージのみ表示するようにしたみたいでした。
そのため、v10に移行するまでに、pre-commitの前半の非推奨の箇所は削除いただくようにしたほうがよさそうです。
おわりに
同じような問題に直面した人や、今後v9からv10にバージョンアップする際に非推奨だったことに気づかずに問題が発生したときに参考にしていただければと思います。