是否应该将包锁定. json 文件添加到. gitignore?

要锁定安装在项目上的依赖项的版本,命令 npm install将创建一个名为 package-lock.json的文件。这是从 Node.js v8.0Npm v5.0.0开始制作的,你们中的一些人可能知道。

尽管 Node.jsNpm建议提交这个文件,但是关于什么时候应该避免提交这个文件的几个问题也是一个选项。通常我们在我们的项目中承诺,然而,这是一个特殊的问题。

虽然默认情况下我们应该提交 package-lock.json文件,但是我们有一个不应该提交的特定情况。例如,如果我们想测试项目依赖关系的最新版本,可以选择将 package-lock.json添加到 .gitignore中。

因此,问题如下:

  1. 应该将 package-lock.json文件添加到 .gitignore吗?
  2. 有没有什么特别的情况,我们 必须的绝对不行这样做?
129545 次浏览

不,package-lock.json 不应该应该加入到 .gitignore中,相反,我强烈建议:

  1. package-lock.json添加到版本控制存储库中
  2. 在本地和部署管道中构建应用程序时,使用 npm ci而不是 npm install
    (ci命令可以从 npm@5.7开始使用,如果有疑问,可以通过 < br/> npm install -g npm升级 npm)

npm install命令最大的缺点之一是它可能会突变 package-lock.json,而 npm ci只使用锁文件中的版本,如果 package-lock.jsonpackage.json不同步,就会产生错误。

此外,npm ci 需要的存在一个 package-lock.json,并会打印一个错误,如果它不存在。 能够相信项目的依赖关系能够在不同的机器上以可靠的方式重复地解决,这是一个很好的用例。

此外,在添加依赖项之前,npm ci会微调整整个 node_modules文件夹,以确保您处理的是实际的依赖项,而不是本地更改,同时仍然比正常的 npm install快。

package-lock.json可以得到这样的结果: 具有完全相同依赖树的已知工作状态。

在过去,我有没有 package-lock.json/npm-shrinkwrap.json/yarn.lock文件的项目,其构建将失败的一天,因为一个随机的依赖得到了一个中断更新。(虽然很多库都遵守 semvar 版本控制准则,但是您不能保证它们不会在小的升级中出现故障。)

这些问题很难解决,因为您有时必须猜测上一个工作版本是什么。

关于测试项目的最新依赖项: 这就是 npm update的用途,我认为它应该由开发人员运行,他们也在本地运行测试,如果出现问题,他们会解决问题,然后提交更改后的 package-lock.json。(如果升级失败,它们可以恢复到最后一个工作的 package-lock.json。)

此外,我很少一次升级所有的依赖项(因为这也可能需要进一步的维护) ,而是选择我需要的更新(例如 npm update {dependency}npm install {dependency}@2.1.3)。这也是为什么我认为它是一个手工维护步骤的另一个原因。

如果你真的想让它自动化,你可以为以下人员创造一份工作:

  • 结帐存储库结帐存储库
  • 运行 npm 更新
  • 做测试
    • 如果测试通过,则提交并推送到存储库
    • 否则将失败,并报告问题需要手动解决

这是我希望在 CI 服务器上看到的东西,比如 Jenkins,不应该通过上述原因通过将文件添加到 .gitignore来实现。


引用 npm 文件:

强烈建议您将生成的包锁提交到 源代码管理: 这将允许团队中的任何其他人 部署,您的 CI/持续集成,以及任何其他运行 Npm 安装在您的包源代码中以获得完全相同的依赖项 你正在开发的树。此外,与这些 更改是人类可读的,并将通知您任何更改 所以您可以注意是否有任何传递 依赖项被更新、悬挂等。

至于 ABC0和 npm install之间的差异:

  • 该项目必须具有一个现有的包-lock. json 或 npm-shinkwrap.json。
  • 如果包锁中的依赖项与 package.json 中的依赖项不匹配,那么 npm ci将退出并显示一个错误,而不是更新 包裹锁。
  • npm ci一次只能安装整个项目: 不能使用此命令添加单个依赖项。
  • 如果 node_modules已经存在,它将在 npm ci开始安装之前被自动删除。
  • 它永远不会写入 package.json或任何软件包锁: 安装基本上是冻结的。