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 の実行フローが複雑になることや、 意図しないコマンドの実行の可能性があること(preserveserveというコマンドが定義されていて、serveを実行する際に意図せずpreserveが実行されてしまうなど)が挙げられています。

対処法

.npmrc に設定を追加することで v6.0.0 以前の挙動に戻すことが可能です。

enable-pre-post-scripts=true

最後に

Yarn が一部を除いて Pre/Post スクリプトを廃止したことは知っていましたが、pnpm も廃止していたとは知らなかったので驚きました。 個人的には Pre/Post スクリプトは便利な機能だと思っていたのですが、意図しないコマンドの実行の可能性があることは確かに問題だと思います。 しかし Pre/Post スクリプト以外にも npm/Yarn/pnpm で挙動がかなり異なってくるので、 きちんとそれぞれのパッケージマネージャの仕様を把握する必要がありますね…

Read next