pnpm では Pre/Post スクリプトは実行されない
はじめに
最近メインで使うパッケージマネージャを Yarn から pnpm に乗り換えたのですが、 Yarn の時に使っていた Pre/Post スクリプトが自動で実行されないことに気づきました。
これは pnpm v6.0.0 からの仕様変更で、 意図的に 実行されないようになっています。 今回は対処法も含めて、pnpm での Pre/Post スクリプトの仕様についてまとめました。
Pre/Post スクリプトとは
Node.js のパッケージマネージャでは Package Script と呼ばれる
package.json
の "scripts"
に書かれたコマンドを実行するタスクランナ的な機能があります。
この機能自体は割と知られていますが、更にそのコマンドに対して前処理、後処理を行う機能もあります。
例えば build
というコマンドを実行する際には、
prebuild
というコマンドが定義されていれば build
が実行される前に prebuild
が自動的に実行されます。
また、postbuild
というコマンドが定義されていれば build
が実行された後に postbuild
が自動的に実行されます。
この機能は npm や Yarn v1 に標準で備わっている機能で、 pnpm でも v6.0.0 以前は使うことができました。 なお、Yarn v2 以降では一部を除いて Pre/Post スクリプトは廃止されています。
v6.0.0 での変更
pnpm v6.0.0 ではこの Pre/Post スクリプトの自動実行が無効化されました。
かなり大きな変更だったようで、当該 Issueではかなり議論が白熱していました。
変更のモチベーションとしては Yarn での廃止と同様に Package Script の実行フローが複雑になることや、
意図しないコマンドの実行の可能性があること(preserve
とserve
というコマンドが定義されていて、serve
を実行する際に意図せずpreserve
が実行されてしまうなど)が挙げられています。
対処法
.npmrc
に設定を追加することで v6.0.0 以前の挙動に戻すことが可能です。
enable-pre-post-scripts=true
最後に
Yarn が一部を除いて Pre/Post スクリプトを廃止したことは知っていましたが、pnpm も廃止していたとは知らなかったので驚きました。 個人的には Pre/Post スクリプトは便利な機能だと思っていたのですが、意図しないコマンドの実行の可能性があることは確かに問題だと思います。 しかし Pre/Post スクリプト以外にも npm/Yarn/pnpm で挙動がかなり異なってくるので、 きちんとそれぞれのパッケージマネージャの仕様を把握する必要がありますね…