NPM如何决定子依赖的下载版本?更新操作相关规则问询
NPM 子依赖版本选择规则问题解答
场景前提
你在package.json中声明了对包A的依赖,且包A的子依赖B在package-lock.json中记录的版本要求为^0.7.28,基于此场景的问题解答如下:
1. 运行npm update时,若B存在0.7.29版本是否会被下载?
不会下载0.7.29版本。
默认情况下npm update不带任何参数时,仅会更新package.json中直接声明的顶层依赖到符合其版本范围的最新版本,不会主动修改子依赖的锁定版本。此时NPM会直接沿用package-lock.json中已经锁定的B的版本,暂时忽略包A声明的^、~等版本范围标识。
2. 运行npm update A时,是否会下载B的0.7.29版本?
会下载0.7.29版本。
当你指定更新特定顶层依赖A时,NPM会重新解析A的完整依赖树,严格按照A声明的子依赖版本范围拉取对应范围内的最新版本。^0.7.28的范围包含0.7.29,因此该版本会被下载,同时package-lock.json中B的锁定版本也会同步更新为0.7.29。
3. 若B的@latest版本是跨大版本的1.x.x,是否会影响上述版本选择逻辑?
不会影响上述逻辑。
NPM的版本选择逻辑会严格遵循依赖声明的版本范围,和registry上标记的@latest版本没有直接关联:
^标识对于0.x.x版本的规则是允许同小版本下的修订版升级,即^0.7.28的有效范围是≥0.7.28 <0.8.0,哪怕registry上存在1.x.x的最新版本,也只会拉取0.7.x范围内的最新修订版,不会跨大版本甚至跨小版本升级~标识的规则是允许同小版本下的修订版升级,例如~0.7.28的有效范围同样是≥0.7.28 <0.8.0,也不会出现跨版本升级的情况
只有当依赖声明的版本范围明确包含更高版本时(例如声明^1.0.0、*等范围),才会拉取对应范围内的更高版本。
内容的提问来源于stack exchange,提问作者Hila
相关产品推荐
相关产品推荐

