Huskyのv8の頃の書き方がv9で非推奨になってたので修正してみた

Huskyのv8の頃の書き方がv9で非推奨になってたので修正してみた

v8からv9になってpre-commitやセットアップコマンドの書き方が非推奨になって、不要な部分が削除されたりしていたので調査してみました

はじめに

リテールアプリ共創部の中野です。

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の場合

.husky/pre-commmit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged

v9の場合

.husky/pre-commmit
lint-staged

Huskyのv9.1.1のリリースノートを確認すると、pre-commitで指定するコマンドのプレフィックスにnpxが不要になったことで、コミットスクリプトを起動する時間が多少短縮したとのことでした。

https://github.com/typicode/husky/releases/tag/v9.1.1

上記のリリースノートより引用した内容だと、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の前半の非推奨の箇所は削除いただくようにしたほうがよさそうです。

https://github.com/typicode/husky/issues/1476#issuecomment-2250296502

https://github.com/typicode/husky/commit/20603175c10e35e58d1eadd20d08a491cfcc5b6a

おわりに

同じような問題に直面した人や、今後v9からv10にバージョンアップする際に非推奨だったことに気づかずに問題が発生したときに参考にしていただければと思います。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.