HERSHY'SのAdvent Calendar(本物)の7日目を開けたところ。
NPMおれおれAdvent Calendar 2019 – 07日目

そういう仕様です。

先にまとめ

  • package-lock.json は NPM リポジトリーに追加されない
  • つまり依存パッケージとしてインストールされる場合、バージョンは固定されない
  • Git のリポジトリーには含めてください

公開されない

One key detail about package-lock.json is that it cannot be published, and it will be ignored if found in any place other than the toplevel package. It shares a format with npm-shrinkwrap.json, which is essentially the same file, but allows publication.

package-lock.json の鍵となる特徴として、公開されないという点があります。またトップレベルパッケージ以外の場所のものは無視されます。npm-shrinkwrap.json は本質的に同じファイルでありその書式を共有していますが、こちらは公開が可能です。

ここでいう「公開 (publish) 」とは npm-publish のことで、NPM パッケージとして公開するという意味です。公開すると npm install xxx でインストールできるようになります。

というわけで npm install xxx でインストールしたパッケージには package-lock.json は含まれていません。

パッケージとしてはバージョンが固定されない

package-lock.json を利用することで利用中の依存パッケージのバージョンをツリー全体で記録できるのですが、前述のとおり NPM のリポジトリーには登録されないので、インストールされるのは package.json に記載のバージョンが許容する範囲の最新のもの、になります。

つまり、手元で開発する場合にのみ package-lock.json が意味を成すって感じですね。

だからといって使わなくてもいいじゃんみたいな話じゃないです。それは別の日に。

shrinkwrap

npm-shrinkwrap.jsonpackage-lock.json と同じようなものですが、こちらは NPM リポジトリーへ含めることが可能です。

可能ですが、強く非推奨 (strongly discouraged) とされています。

おしまい

偉そうな顔して shrinkwrap 使ったことないので正直肌感がわかってないです。

参照

関連