📦
pnpmコマンド第一引数はこのように探索される
最近、pnpmを使い始めた。pnpmを使っているリポジトリを訪問しては、こんなふうに使うんだなと眺めている。
(pnpm build
…ほうほう、package.json
のscripts
セクションを見てくれるんだな)
(ということは、第一引数はpnpmのコマンドとは限らないのだ。「そんなコマンドがあるのか」などと思ってはいけないのだな。これはどのように解釈されるのか分かってないと読みづらい)
というわけで第一引数の解釈を整頓した。
解釈の概要
結論から言うとこうだ。
第一引数 <firstArg>
は
- まずは
pnpm
のコマンドを探す。あったら実行する - 次に
packages.json
のscripts
セクションを探す。あったら実行する - 次にインストールされたパッケージが提供するコマンドを探す。あったら実行する
- 次に通常のシェルコマンドとして実行する。そのようなコマンドがあれば実行する
- 全部になければ
Command "<firstArg>" not found
と表示される
という順序で探索される。
pnpmの動き
- まずは
pnpm
のコマンドを探す。あったら実行する - コマンドに見つからなかったら、
pnpm run <firstArg>
として解釈される。つまり、packages.json
のscripts
セクションを探す。あったらそれを実行する -
scripts
で見つからなかったら、pnpm exec <firstArg>
として解釈される -
pnpm exec <firstArg>
は
- 環境変数
PATH
の冒頭にnode_modules/.bin
を追加 -
<firstArg>
をシェルコマンドとして実行する(第二引数以下は引数として渡される) - つまり、現環境内でインストールされているパッケージの
bin
セクションに記されたコマンドの中にあればそれを実行し、なければシェルのプロンプトで実行しようとしたときと同じ動きをする
何が動くかを表示してくれたりはしない
少し探してみたが、この引数を渡したときに何が実行されるのかを表示だけしてくれるようなコマンドはなかった。ぶっつけ本番だ。
pnpm
コマンド一覧
コマンドの一覧が意外となかったので、コードから採取しておいた。(2024-12-11現在) 実際は省略形も通用するため、もっと多い。
コマンド一覧
- access
- add
- adduser
- audit
- bin
- bugs
- cache
- catFile
- catIndex
- ci
- config
- create
- dedupe
- deploy
- deprecate
- dist-tag
- dlx
- docs
- doctor
- edit
- env
- exec
- fetch
- find
- findHash
- generateCompletion
- getCommand
- home
- importCommand
- info
- init
- install
- installTest
- issues
- licenses
- link
- list
- ll
- login
- logout
- outdated
- owner
- pack
- patch
- patchCommit
- patchRemove
- ping
- pkg
- prefix
- profile
- prune
- publish
- rebuild
- recursive
- remove
- repo
- restart
- root
- run
- s
- se
- search
- selfUpdate
- server
- set-script
- setCommand
- setup
- show
- star
- stars
- store
- team
- token
- unlink
- unpublish
- unstar
- update
- v
- version
- view
- whoami
- why
- xmas
Discussion