【小ネタ】huskyを導入したプロジェクトでnpmパッケージを公開するときに必要な設定
こんにちは。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
に記載していました。
{ "scripts": { "postinstall": "husky install" } }
npmjs.comのようにパッケージを公開する場合、typicode/pinstを使って以下のように、prepack
時のpostinstall
スクリプトを無効化する必要があります。
{ "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.
最後に
どこかで拾った設定をコピペしてミスをするという、恥ずかしいことをしてしまったので、今後気を引き締めなおしたいと思います。
小ネタとなりましたが、自分が失敗したことを惜しみなく公開してみました。
この記事が誰かのミスを防いだり、エラー解消に役立てばうれしいです!
以上、今泉でした。