npm ci --prefixは指定ディレクトリにpackage.jsonが無いと動かない

  • npm
  • Node.js

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

npm ci --prefix path/to/dir で指定ディレクトリにインストールできるか気になったので試した。

試したこと

適当なサブディレクトリに package.json と package-lock.json を用意して、親ディレクトリから --prefix 経由で npm ci を叩いてみた。

$ npm ci --prefix ./sub
added 1 package, and audited 2 packages in 680ms

./sub/node_modules に依存パッケージがインストールされた。cwdを移動せずに済むので、複数モジュールを持つリポジトリのビルドスクリプトなどでは便利。

前提条件がある

ただし動作するのは、指定ディレクトリ側に package.json と package-lock.json(または npm-shrinkwrap.json)が両方すでに存在している場合。

package-lock.json はあるが package.json が無い、というディレクトリに対して --prefix を使うとエラーになる不具合が npm/cli のリポジトリで複数バージョンにわたって報告されている(npm/cli#4001)。cwdを移動して直接 npm ci を叩けば問題なく動くケースでも、--prefix 経由だとコケるらしい。手元では未確認。

挙動としてはnpm installと同じ

--prefix を付けても npm ci は通常通り、実行前に対象ディレクトリの node_modules を削除してからクリーンインストールする。ここは --prefix の有無に関係ない共通の挙動。

まとめ

  • path/to/dir に package.json + package-lock.json が揃っていれば npm ci --prefix path/to/dir は問題なく動く
  • 揃っていない状態(特に package.json が無い状態)だと失敗する報告がある