npm install と npm ci の違いを勘違いしていた説

Gemini によると、 package.json と package-lock.json が一致していれば npm install と npm ci の挙動は一致するらしい
というのが認識とちょっとズレるのでちゃんと調べる

現状の認識
- npm install は semver の範囲で最新版をインストールしうる
- package-lock.json より node_modules のほうが新しいバージョンがインストールされうる
- npm ci は package-lock.json を更新しないが、 npm install は更新されうる
- npm install で package-lock.json が更新される前提は知らない
- ローカルでも npm ci を使えばパッケージバージョンが常に固定されて安全

Gemini の主張
- npm install で package-lock.json が更新されるのは、 package.json の内容と矛盾するとき
- package.json と package-lock.json 間に矛盾がなければ npm ci と挙動は一致する
- dependencies のバージョン固定は package-lock.json と矛盾しているときに npm install したときにインストールするバージョン範囲である

npm install で package-lock.json が更新されるのは、 package.json の内容と矛盾するとき
npm install はデフォルトで --save
と --package-lock
オプションが true であり、更新がない場合は package-lock.json に基づいてインストールされる
This command installs a package and any packages that it depends on. If the package has a package-lock, or an npm shrinkwrap file, or a yarn lock file, the installation of dependencies will be driven by that

package.json と package-lock.json 間に矛盾がなければ npm ci と挙動は一致する
package-lock.json に基づいてインストールされるなら、 package.json に変化がない場合は npm ci
と挙動は一致する
npm-ci は package-lock.json が package.json と矛盾するときにエラーにするところが異なる認識でよさそう

dependencies のバージョン固定は package-lock.json と矛盾しているときに npm install したときにインストールするバージョン範囲である
--save
と --package-lock
が true のときに npm install
したときにだけ package-lock.json が更新される
そのため、バージョン固定の範囲は「 pacakge.json が変更された時にインストールする範囲」であり、 package.json が変化していない限りバージョンは変わらない