npm run で Missing script エラーが出てスクリプトを実行できない
`npm run xxx` で `Missing script` エラーが出るのは、`package.json` の scripts にキーが無い、実行ディレクトリが違う、workspace の指定漏れの 3 系統。
`npm run` を引数なしで実行し、現在の `package.json` の script 一覧を確認するのが最短。
#npm#scripts#package-json#workspace#run
公開:
要約
npm ERR! Missing script は package.json の scripts にキーが無い、または 見ている package.json が違う のどちらか。npm run を引数なしで実行すれば現在のディレクトリの全 script が表示されるので、まずそこで切り分ける。
よくある原因
- typo / 別名:
startをserveと書くなど、ドキュメントと実装で script 名が違う - 間違ったディレクトリ: monorepo で
apps/web配下にいるのに root の script を期待している - workspace の指定漏れ: workspaces 構成で
-wを付けずに root から子の script を呼んでいる package.json破損: 末尾カンマや quote の不整合で JSON 全体が読めず、scripts も空扱いscript-shell設定: 過去にnpm config set script-shellで無効な shell を指定していると、全 script が失敗する
解決策
1. 一覧表示で確認する
npm run引数なしで実行すると、現在のディレクトリの package.json に定義された script 一覧が表示される。
ここに無ければ存在しない(npm-run-script 公式 参照)。
2. package.json を直接確認する
jq .scripts package.jsonjq が無ければ cat package.json でも可。
typo の確認はここで終わらせる。
3. ディレクトリ位置を確認する
pwd
ls package.jsonmonorepo では root と app それぞれに package.json がある。
app 側を動かしたいなら cd apps/web してから npm run dev。
4. workspace の場合
# root から子 workspace の script を指定
npm run build -w @scope/app
# 全 workspace で実行(script が無い workspace は skip)
npm run build --workspaces --if-presentscripts の挙動全般は公式の Using npm/scriptsを参照。
5. shell 設定をリセット
npm config get script-shell
npm config delete script-shell # 既定(OS 標準シェル)に戻すユーザ単位の ~/.npmrc の設定が壊れていると、全 script が command not found を返す。