恥ずかしながらちゃんと理解してなかったので調べました
package.jsonのバージョン指定
"dependencies": {
"express": "~4.16.1",
"mongodb": "^5.0.1",
}
このチルダ(~)とキャレット(^)の違いって何よ。。。
こういうこと
チルダ ~4.16.1は「4.16.0 <= インストールバージョン < 4.17.0」ということ
キャレット^4.16.1は「4.0.0 <= インストールバージョン < 5.0.0」ということ
package-lock.jsonとの関係性
package.jsonで指定したバージョンはnpm installを実行したタイミングでインストールされるバージョンが異なる可能性があります。
また、package.jsonのインストール対象がさらに別のnpmモジュールに依存していた場合、その依存モジュールのインストールされるバージョンまで異なる可能性があります。
package-lock.jsonとは、package.jsonを元に実際にインストールされたnpmパッケージのバージョンと、依存関係を管理しているファイルとなります。
package-lock.jsonがあれば、チルダ、キャレットに関わらずpackage-lock.jsonに記述されたバージョンをインストールするようになります。
そのため、チーム開発をしている場合、人によって、npm installを実行するタイミングで微妙にバージョンが異なります。というのはなくなります。
リリースも同様ですね。リリースするたびに微妙にインストールされるnpmパッケージが異なります。ってのは普通に嫌ですね。
また、優先度ですが下記のようです。
①pakcage.jsonとpackage-lock.jsonに差がある → package.jsonに従う(あるパッケージをバージョンアップしたときなど)
②package.jsonとpackage-lock.jsonに差がない → pakcage-lock.jsonに従う(通常時はこれですかね)
③package-lock.jsonがない → package.jsonに従う。package-lock.jsonは新規で作成される(最初にnpm installするとき)
④package.jsonがない → エラー(まあ、当たり前ですが、、、気になったので試してみました)
いままで超いい加減で、うまくいかなかったら一回削除してnpm installしなおせばうまくいくやつという謎の認識でしたが、
更新されたpackage-lock.json普通にコミットしてたな。。。気を付けます。。。