よくpnpm execとpnpm dlxのどっちがどっちなのか分からなくなるのでまとめる。
pnpm exec
プロジェクト内でnode_modules/.binに置かれたコマンドの実行や、スクリプトの実行を行うコマンド。
# node_modules/.bin/vitestを実行
pnpm exec vitest
# websiteワークスペース内でlsを実行
pnpm -F website exec ls
既存の名前と衝突しなければ、execは省略できる。
# node_modules/.bin/vitestを実行
pnpm vitest
# インストールされたパッケージ一覧が表示される(pnpm exec lsではない)
pnpm ls
pnpm dlx
プロジェクト内の依存関係に関係なく、パッケージをレジストリから取得してデフォルトのコマンドを実行するコマンド。
# storybookの初期化
pnpm dlx storybook@latest init
pnpxはpnpm dlxのエイリアスとして使える
pnpx storybook@latest init
特定のワークスペースで実行したい場合は、--filterや-Fで指定するのではなく--packageを利用する。
pnpm --package=website dlx storybook@latest upgrade
判別する
pnpmとYarn、npmの比較表でpnpm dlxはnpxと同列にされていることから、npxと同じように末尾がxで終わるコマンドは、外部パッケージを利用するみたいに覚えると良さそうに感じた。
npxとpnpm dlxは「パッケージの直接実行」として同列に挙げられているので、npxはローカルに対象のパッケージがあればそれを参照してコマンドを実行する。
同様にnpm execもpnpm execとは動作が異なるので注意すること。