是否应将package-lock.json文件添加到.gitignore?

Fra*_*sto 25 javascript git gitignore node.js npm

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

尽管有关于提交此文件的Node.jsnpm建议,但是关于何时应该避免这样做的几个问题也是一种选择.通常我们在项目中承诺,但这是一个特殊的问题.

虽然我们应该package-lock.json默认提交文件,但我们有一个特定的情况我们不应该.举例来说,如果我们要测试的最新版本的项目依赖的,它可以增加一个选项package-lock.json进入.gitignore.

所以,问题如下:

  1. 应该将package-lock.json文件添加到.gitignore
  2. 是否有任何特殊情况,我们必须绝不可以这样做?

k0p*_*kus 33

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

您应该将您添加package-lock.json到版本控制存储库.

我还强烈建议使用npm ci而不是npm install在构建应用程序时,工作流程需要存在ci.(npm install -g npm命令的最大缺点之一是它可能会改变它npm install,而package-lock.json只使用lockfile中的版本并且如果package-lock.json npm ci不同步则会产生错误.)

有一个强大的用例,可以相信项目的依赖关系可以在不同的机器上以可靠的方式重复解决.

package-lock.json你得到的确是:一个已知的工作状态.

在过去,我有没有package-lock.json/shrinkwrap/yarn.lock文件的项目,这些文件的构建将在一天内失败,因为随机依赖关系会有更新.这些问题有时难以解决,因为您有时不得不猜测最后一个工作版本是什么.

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

此外,我很少一次升级所有依赖项,但有时我会挑选我需要的更新.这是我将其视为手动维护步骤的另一个原因.

如果您想让它自动化,您可以创建一份工作:

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

这是我在CI服务器上托管的东西,例如Jenkins,并且不应该通过上述原因通过添加文件来实现npm ci.


或者引用npm doc:

强烈建议您将生成的包锁提交给源代码控制:这将允许团队中的其他任何人,您的部署,CI /持续集成以及在您的包源中运行npm install的任何其他人获得完全相同的依赖关系树你正在开发的.此外,这些更改的差异是人类可读的,并将告知您npm对node_modules所做的任何更改,因此您可以注意到是否有任何传递依赖项已更新,提升等.

并且关于vs 之间node_modulesnpm install区别:

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

  • @MagicLAMP您应该在构建服务器上使用“npm ci”而不是“npm install”。那么你的问题就会消失。 (5认同)
  • Fwiw [_webpack_ Github](https://github.com/webpack/webpack/blob/master/.gitignore) 上的 `.gitignore` 确实包含 `package-lock.json`... (3认同)
  • @JSStuball webpack 使用yarn 而不是npm。它的存储库中有一个yarn.lock(相当于package-lock.json)。另请参阅:https://github.com/webpack/webpack/pull/6930#issuecomment-377987981 (3认同)
  • @k0pernikus 终于让 npm ci 在我的 ansible 部署上工作,并将包锁提交到存储库。这允许我的前端开发人员部署东西。谢谢。 (3认同)
  • @Jundl `npm ci` 应该仍然使用 `~/.npm` 内的缓存。它只会破坏“node_modules”,但它不应该总是下载所有内容。您的设置有什么特别之处吗? (3认同)
  • 我不同意,尽管我使用的是 npm install,而不是 npm ci。使用 npm install 时,repo 上的 package-lock.json 会导致部署出现问题。在 /sf/ask/3094474771/#54102769 上看到我的回答 (2认同)
  • 谢谢@k0pernikus。我会在本周尝试这个并再次发表评论。 (2认同)
  • @MagicLAMP 检查你的 npm 版本。`npm ci` 从 npm@5.7 开始可用,当前版本是 `npm@6.11`。您可以通过“npm install -g npm”更新您的 npm。 (2认同)
  • @MagicLAMP 和 `ci` 不是简写,它是它自己的具有不同行为的命令,即:它核对 node_modules,安装 package-lock.json 中的所有依赖项,而不会改变它。阅读链接页面了解更多详细信息:https://docs.npmjs.com/cli/ci (2认同)
  • @Jundl您能否以“为什么 npm ci 不使用缓存来实现 chromium 依赖?”的形式提出一个新问题?并参考您的 package.json 的最小、完整且可验证的示例?那时我就​​去看一下。您可以在此处链接您的问题。 (2认同)