こんにちは。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を導入
- コミット時にcommitlint/@commitlint/config-conventionalのルールを強制
- 問題なく開発を終えて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 pinst
でpinst
をインストールして、再度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.
最後に
どこかで拾った設定をコピペしてミスをするという、恥ずかしいことをしてしまったので、今後気を引き締めなおしたいと思います。
小ネタとなりましたが、自分が失敗したことを惜しみなく公開してみました。
この記事が誰かのミスを防いだり、エラー解消に役立てばうれしいです!
以上、今泉でした。