【小ネタ】huskyを導入したプロジェクトでnpmパッケージを公開するときに必要な設定

自作のnpmパッケージを公開したところhuskyの設定ミスで「npm ERR! command sh -c husky」というエラーが発生するようになり、せっかく公開したパッケージが利用できない状態となってしまいました。 その時の解決策について書いてみました!
2023.03.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部コンサルティング部に所属している今泉(@bun76235104)です。

みなさん、huskyというツールをご存じですか?

huskyはgitコマンドのpre-commitなどのフックを使って、テストの実行や各種リントの実行を制御できます。

たとえば、以下のブログではcommitlintと組み合わせることで、commitメッセージのリントを実行しています。

私も自分で作成した公開npmパッケージの開発時に、このようなルールを組み込んでいたのですが、公開用の設定を追記するのを失念していたため、以下のようなエラーを出してしまいました。

❯ npm i `自分で公開したパッケージ` #新しいバージョンをnpmでインストールしようとする
npm ERR! code 127
npm ERR! path /${プロジェクトへのパス}/node_modules/textlint-rule-aws-service-name
npm ERR! command failed
npm ERR! command sh -c husky install
npm ERR! sh: husky: command not found

npm ERR! A complete log of this run can be found in:

エラーが発生するまでの経緯はこのような順序です。

  • 開発者向けにhuskyとcommitlintを導入
  • 問題なく開発を終えてnpmパッケージの新バージョンを公開
  • npm i コマンドで新バージョンに更新しようとしたところ上記エラーが発生
    • 公開したパッケージが全く利用できない状態になってしまった
    • ※ エラーが出た新バージョンの公開を停止しました(npm unpublish コマンドを利用)

必要な設定

当初、以下のようにpackage.jsonに記載していました。

package.json

{
  "scripts": {
    "postinstall": "husky install"
  }
}

npmjs.comのようにパッケージを公開する場合、typicode/pinstを使って以下のように、prepack時のpostinstallスクリプトを無効化する必要があります。

package.json

{
  "scripts": {
    "postinstall": "husky install",
    "prepack": "pinst --disable",
    "postpack": "pinst --enable"
  }
}

このようにpackage.jsonに追記の上、npm i --save-dev pinstpinstをインストールして、再度npmパッケージを公開しました。

すると公開したパッケージをnpm iによりインストールする際に発生していたエラーが消えて、利用できるようになりました!

❯ npm i `自分で公開したパッケージ` #新しいバージョンをnpmでインストールしようとする
# エラーが起きずに無事利用できるようになりました!

こちらについては、huskyのドキュメントに明記されており、単に私が見落としてしまっていました。

if your package is not private and you're publishing it on a registry like npmjs.com, you need to disable postinstall script using pinst. Otherwise, postinstall will run when someone installs your package and result in an error.

最後に

どこかで拾った設定をコピペしてミスをするという、恥ずかしいことをしてしまったので、今後気を引き締めなおしたいと思います。

小ネタとなりましたが、自分が失敗したことを惜しみなく公開してみました。

この記事が誰かのミスを防いだり、エラー解消に役立てばうれしいです!

以上、今泉でした。