npmパッケージがインストールされるバージョンをできるだけ固定したい #2173
KentaHizume
started this conversation in
03: アイディア
Replies: 2 comments
-
正しい運用かどうかは議論の余地があるが、推移的に依存しているものでバージョンを固定したい場合は、1段目に書いてしまうことも可能ではある。 |
Beta Was this translation helpful? Give feedback.
0 replies
-
幅のある指定はライブラリを公開する場合に壊れにくくするために可能になっているはずなので、 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
概要
同じ
package.json
を使用していても、インストールされる npm パッケージのバージョンが異なる場合があり、これにうまく対処する方法を探しています。現在の論点は下記の2点です。
~
、キャレット^
を使用した幅のあるバージョン指定は避けたほうがよいのではないかと思っているのですが、こちらの是非を伺いたいです。現状整理
npm では、
package.json
を用いてパッケージとバージョンを指定する。また、パッケージのバージョンと依存関係は
package-lock.json
に記録される。現在、
package.json
では、下記のように幅のあるバージョン指定をしている。チルダ
~
:パッチバージョンのアップデートを許容するキャレット
^
:マイナーバージョンのアップデートを許容するたとえば、viteの最新版が@6.0.5の状態で、
npm ci
を実行package.json
で"vite": "^6.0.0"
を指定npm install
を実行npm ls vite
で実際にインストールされたバージョンを確認すると、
[email protected]
がインストールされる。問題点1
パッケージが semantic versioning に従っていれば影響はないはずだが、
従っていない場合、あるいは想定外の影響があった場合に、不具合の要因となる。
また、maia/maris固有の問題として、
フロントエンドのnpmパッケージの更新を時間差で行うので、
フロントエンドのコードは共通だが、
使用しているパッケージが異なる(
package-lock.json
に差分がある)という事象が発生する。解決策
package.json
でのバージョン指定では、固定のバージョンを指定する。このことにより、直接依存するパッケージについてはバージョンが固定される。
問題点2
直接依存するパッケージについて、固定のバージョンを指定したとしても、
推移的に依存するパッケージのバージョンについて同様の問題が発生する。
というのも、依存先のパッケージの
package.json
で幅のあるバージョン指定をしていた場合は、この設定に基づいて依存関係が解決されるからである。
解決策
公式ドキュメントの下記の箇所によると、
overrides
フィールドを使用することで、深い階層のパッケージについてもバージョンを固定できる。そのため依存パッケージをすべて列挙すればすべてのパッケージのバージョンを固定できるはずである。
懸念点
overrides
フィールドをメンテナンスし続けることが必要になるが、複数の階層にわたって推移的に依存していることも多くあるので、列挙・管理するには複雑すぎて、
逆に問題を引き起こす恐れがある。具体的には、
overrides
フィールドのメンテ忘れによる不具合や、セキュリティアップデートへの対応漏れを引き起こす可能性がある。暫定案
package.json
でのバージョン指定では、固定のバージョンを指定する。一方で、
overrides
フィールドの使用は避ける。Beta Was this translation helpful? Give feedback.
All reactions