npm@5已经发布,它有一个新的功能package-lock.json
文件(在npm安装
之后),这让我很困惑。我想知道,这个文件有什么效果?
当属性(如版本属性)中的数值或依赖属性在package.json
中更改时,将写入package-lock.json
。
如果这些数值在包中。json和包锁。json
匹配,包锁。从中读取json
。
如果这些数值在包中。json和包锁。json不匹配,
包锁。json将使用这些新值和新的修饰符(如插入符号和波浪号)写入。但正是这个数字触发了对
包锁的更改。json
。
要理解我的意思,请执行以下操作。使用
包。json不带包锁。json
,运行npm安装
:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "7.2.2"
}
}
包锁。json现在将具有:
"sinon": {
"version": "7.2.2",
现在将这两个文件复制/粘贴到新目录。更改
包。json
to(仅添加插入符号):
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.2.2"
}
}
运行
正在从npm安装
。如果没有包锁。json
文件,sinon@7.3.0将安装<代码>npm安装程序包锁读取。json
和安装7.2。2.
现在更改
包。json
发送至:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.3.0"
}
}
运行
npm安装
<代码>包锁。json已写入,现在将显示:
"sinon": {
"version": "^7.3.0",
对于npm来说,这是一个非常重要的改进:保证每个包的版本完全相同。
如何确保在不同的时间在不同的环境中使用相同的包构建项目?比方说,您可以使用^1.2。3在您的
软件包中。json
,或者您的某些依赖项正以这种方式使用,但是如何确保每次npm安装
都会在您的开发机器和构建服务器中获取相同的版本?包裹锁。json将确保这一点。
npm安装
将重新生成锁文件
在构建服务器或部署服务器上时,执行npm ci(将从锁文件中读取,并安装整个包树)
它存储一个精确的、版本化的依赖树,而不是使用星型版本控制,如package.json
本身(例如。1.0.*)。这意味着您可以保证其他开发人员或产品发布等的依赖关系。它还具有锁定树的机制,但通常会在package.json
更改时重新生成。
从npm文档中:
对于npm修改node_modules树或package.json.的任何操作,都会自动生成package-lock.json它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖关系更新如何。
此文件旨在提交到源存储库中,并用于各种用途:
描述依赖关系树的单一表示形式,以确保团队成员、部署和持续集成能够安装完全相同的依赖关系。
为用户提供一种工具,使其能够“时间旅行”到节点_模块的先前状态,而无需提交目录本身。
通过可读的源代码管理差异,提高树更改的可见性。
并通过允许npm跳过以前安装的包的重复元数据解析来优化安装过程。"
回答jrahhali下面关于使用具有确切版本号的package.json
的问题。请记住,您的package.json
只包含您的直接依赖项,而不包含依赖项的依赖项(有时称为嵌套依赖项)。这意味着使用标准的package.json
,您无法控制这些嵌套依赖项的版本,直接引用它们或将它们作为对等依赖项引用将无济于事,因为您也无法控制您的直接依赖项为这些嵌套依赖项定义的版本容差。
即使您锁定了直接依赖项的版本,您也不能100%保证您的完整依赖项树每次都是相同的。其次,您可能希望允许对直接依赖项进行非破坏性更改(基于语义版本控制),这会使您对嵌套依赖项的控制更少,而且您也无法保证直接依赖项在某个时候不会破坏语义版本控制规则本身。
所有这些问题的解决方案是锁定文件,如上所述,该文件锁定在完整依赖关系树的版本中。这允许您为其他开发人员或发行版保证您的依赖关系树,同时仍然允许使用标准包测试新的依赖关系版本(直接或间接)。json
。
注意。上一个npm包覆面提取。json做了几乎相同的事情,但是锁文件重命名了它,以便它的功能更清晰。如果项目中已经有收缩包装文件,则将使用该文件而不是任何锁定文件。
我错过了什么?如何让npm真正尊重我的锁文件?
问题内容: 我最近才升级到 npm @ 5 。我现在有一个 package-lock.json 文件,其中包含 package.json中的 所有内容。我希望当我运行该程序时,将从锁定文件中提取依赖项版本,以确定应该在我的 node_modules 目录中安装什么。奇怪的是,它实际上最终修改并重写了 package-lock.json 文件。 例如,锁定文件的打字稿指定为版本 2.1.6 。然后,
所以,我有这个包裹,在package-lock.json里面: 该漏洞是:“大括号”:“^1.8.2”,当我运行npm audit时,它表示已修复为2.3。1,但我似乎无法更新它,或者只是不知道如何更新。 我尝试过的事情: npm安装micromatch和支架,然后进行npm审计修复 npm安装 从npm依赖关系中,可能有一些事情我不理解。那么我该如何解决这个问题呢? 为软件包编辑。json
我正在学习使用Node.js和express框架的后端。我通过添加了模块。几个小时后,我注意到我的项目不包含package.json文件。 我现在尝试添加测试命令来使用nodemon。比如。但是在package-lock.json文件中没有这样的部分。 我不想再从头开始。
有没有办法检查一个文件是否与兼容,而不运行?兼容意味着指定的版本可以通过来实现。 当前方法 我目前正在通过运行并检查是否更改为: 用例 我想在持续集成中添加一个测试,以确保如果开发人员修改了,他们也会相应地更新。这一点很重要的原因是我们的持续集成使用了,而不是仅引用,因此如果开发人员不更新锁文件,持续集成设置将与他们期望的不匹配。
问题内容: npm 5已于今天发布 ,其中一项新功能包括通过创建文件进行确定性安装。 该文件应该保留在源代码管理中吗? 我假设它类似于和,这两个都应该保留在源代码管理中。 问题答案: 是的,旨在被检查到源代码管理中。如果您使用的是npm 5,则可能会在命令行上看到:根据: 会为npm修改树或的任何操作自动生成。它描述了生成的确切树,因此无论中间依赖项更新如何,后续安装都可以生成相同的树。 该文件旨