📦

pnpmコマンド第一引数はこのように探索される

2024/12/11に公開

最近、pnpmを使い始めた。pnpmを使っているリポジトリを訪問しては、こんなふうに使うんだなと眺めている。

pnpm build …ほうほう、package.jsonscriptsセクションを見てくれるんだな)

(ということは、第一引数はpnpmのコマンドとは限らないのだ。「そんなコマンドがあるのか」などと思ってはいけないのだな。これはどのように解釈されるのか分かってないと読みづらい)

というわけで第一引数の解釈を整頓した。

解釈の概要

結論から言うとこうだ。

第一引数 <firstArg>

  1. まずはpnpmのコマンドを探す。あったら実行する
  2. 次にpackages.jsonscriptsセクションを探す。あったら実行する
  3. 次にインストールされたパッケージが提供するコマンドを探す。あったら実行する
  4. 次に通常のシェルコマンドとして実行する。そのようなコマンドがあれば実行する
  5. 全部になければ Command "<firstArg>" not foundと表示される

という順序で探索される。

pnpmの動き

  1. まずはpnpmのコマンドを探す。あったら実行する
  2. コマンドに見つからなかったら、pnpm run <firstArg> として解釈される。つまり、packages.jsonscriptsセクションを探す。あったらそれを実行する
  3. scriptsで見つからなかったら、pnpm exec <firstArg>として解釈される
  4. 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