我刚刚升级到npm @ 5 . 我现在有一个package-lock.json文件,包含package.json中的所有内容 . 我希望,当我运行 npm install
时,将从锁定文件中提取依赖版本以确定应该在我的node_modules目录中安装什么 . 奇怪的是它实际上最终修改并重写了我的package-lock.json文件 .
例如,锁定文件的typescript指定为版本2.1.6 . 然后,在 npm install
命令之后,版本更改为2.4.1 . 这似乎打败了锁定文件的整个目的 .
我错过了什么?如何让npm真正尊重我的锁文件?
11 回答
这似乎也发生在npm6 - 我运行了
npm i
而没有改变任何东西,我的package-lock.json
被修改了(requires
中所有包下的版本都改变了) .它似乎打算而不是打破任何东西?更多信息here
看来这个问题已在npm v5.4.2中修复
https://github.com/npm/npm/issues/17979
(向下滚动到主题中的最后一条评论)
Update
实际上已在5.6.0中修复 . 5.4.2中存在一个跨平台错误,导致问题仍然存在 .
https://github.com/npm/npm/issues/18712
Update 2
在这里看到我的回答:https://stackoverflow.com/a/53680257/1611058
npm ci
是您现在安装现有项目时应该使用的命令 .Update 3: 正如其他答案所指出的那样,
npm ci
命令在npm 5.7.0中引入,作为在CI上下文中实现快速且可重现的构建的另一种方式 . 有关详细信息,请参阅documentation和npm blog .Update 2: 更新和澄清文档的问题是Github issue #18103 .
Update 1: 下面描述的行为在npm 5.4.2中得到修复:当前预期的行为在Github issue #17979中列出 .
Original answer:
package-lock.json
的行为在npm 5.1.0中已更改,如issue #16866中所述 . 您观察到的行为显然是从版本5.1.0开始的npm .这意味着只要在
package.json
中找到一个依赖项的新版本,package.json
就可以胜过package-lock.json
. 如果要有效地固定依赖关系,现在必须指定没有前缀的版本,例如,您需要将它们编写为1.2.0
而不是~1.2.0
或^1.2.0
. 然后package.json
和package-lock.json
的组合将产生可重现的构建 . 要明确:单独package-lock.json
不再锁定根级依赖项!无论这个设计决定是否合适都是有争议的,因此在issue #17979中对Github的混淆导致了持续的讨论 . (在我看来,这是一个值得怀疑的决定;至少名称
lock
不再适用 . )还有一个注意事项:对不支持不可变包的注册表也有限制,例如直接从Github而不是npmjs.org提取包时 . 有关详细说明,请参见this documentation of package locks .
使用新推出的
Introducing npm ci for faster, more reliable builds
在他们的github页面上有一个未解决的问题:https://github.com/npm/npm/issues/18712
当开发人员使用不同的操作系统时,此问题最为严重 .
你可能有类似的东西:
在你的
package.json
哪个npm更新到最新的次要版本,在你的情况下2.4.1
更多关于
package-lock.json
:对于npm修改node_modules树或package.json的任何操作,都会自动生成package-lock.json . 它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖性更新 .
此文件旨在提交到源存储库中,并用于各种目的:
https://docs.npmjs.com/files/package-lock.json
在将来,您将能够使用
--from-lock-file
(或类似)标志从package-lock.json
安装 only 而无需修改它 .这对于可重复构建很重要的CI等环境非常有用 .
有关该功能的跟踪,请参阅https://github.com/npm/npm/issues/18286 .
我发现将有一个新版本的npm 5.7.1使用新命令
npm ci
,它将仅从package-lock.json
安装编辑:名称"lock"是一个棘手的,它的NPM试图赶上纱线 . 它不是一个锁定的文件 .
package.json
是一个用户固定的文件,一旦"installed"将生成node_modules文件夹树,然后该树将写入package-lock.json
. 所以你看,它的另一种方式 - 依赖版本将一如既往地从package.json
拉出,package-lock.json
应该被称为package-tree.json
(希望这会让我的答案更加清晰,经过这么多的投票后)
一个简单的答案:
package.json
像往常一样有你的依赖,而package-lock.json
是"an exact, and more importantly reproducible node_modules tree"(取自npm docs itself) .至于棘手的名字,它的NPM试图赶上Yarn .
这是一个可以解释事物的场景(使用NPM 6.3.0验证)
你在package.json中声明了一个依赖,如:
然后你这样做,
npm install
将生成一个package-lock.json:几天之后,一个较新的次要版本的“depA”被释放,比如“1.1.0”,那么以下情况属实:
接下来,您手动将package.json更新为:
然后重新运行:
使用
npm ci
命令而不是npm install
.“ci”代表“干净安装” . 它将基于package-lock.json文件而不是lenient package.json文件依赖项来安装项目依赖项 .
它会为你的其他队友提供相同的构建,而且速度也快得多 .