package-lock.json文件应该被添加到.gitignore中吗?

180
为了锁定项目安装的依赖版本,命令npm install会创建一个名为package-lock.json的文件。自从Node.js v8.0.0npm v5.0.0以来,这一功能就已经存在了。
虽然Node.jsnpm都建议将此文件提交到代码库中,但我们也可以考虑在某些情况下避免这样做。通常我们会在项目中提交它,但这是一个特殊的问题。
虽然默认情况下应该提交package-lock.json文件,但如果我们想测试项目依赖项的最新版本,将其添加到.gitignore中可能是一个选择。
因此,问题如下: 1. package-lock.json文件是否应该添加到.gitignore中? 2. 是否有任何特殊情况下我们必须不得这么做?

相关链接:https://dev59.com/21QK5IYBdhLWcg3wF796 - k0pernikus
1个回答

335
不,不应将package-lock.json添加到.gitignore中。相反,我强烈建议:
  1. package-lock.json添加到版本控制存储库中
  2. 在本地构建应用程序和部署管道时使用npm ci而不是npm install。(ci命令自npm@5.7以来可用,如果有疑问,请通过以下方式升级npm:
    npm install -g 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 文件的项目,由于随机依赖项进行了破坏性更新,它们的构建会在某一天失败。这些问题很难解决,因为有时您必须猜测最后一个有效版本是哪个。
关于测试项目的最新依赖项:这就是 npm update 的用途,我认为应该由开发人员执行,他们还应该在本地运行测试,解决可能出现的问题,然后提交更改的package-lock.json。(如果升级失败,可以恢复到上一个工作的package-lock.json。)
此外,我很少一次性升级所有依赖项(因为这也可能需要进一步的维护),而是选择我需要更新的内容(例如,npm update {dependency}npm install {dependency}@2.1.3)。这也是为什么我认为它是手动维护步骤的另一个原因。
如果你真的想自动化它,你可以创建一个作业来完成以下任务:
- 检查存储库 - 运行 npm update - 运行测试 - 如果测试通过,则提交并推送到存储库 - 否则失败并报告问题以手动解决
我认为这应该托管在 CI 服务器上,例如 Jenkins,并且不应该通过将文件添加到 .gitignore 来实现。

或者按照npm文档建议

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

关于npm ci与npm install之间的区别, 请参考以下内容:

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

8
在你的构建服务器上,最好使用npm ci而不是npm install。这样你的问题就会消失了。 - k0pernikus
6
就我的了解,webpack Github上的.gitignore确实包括package-lock.json... - jsstuball
7
webpack使用yarn而不是npm。它在其存储库中有一个yarn.lock文件(相当于package-lock.json)。请参见:https://github.com/webpack/webpack/pull/6930#issuecomment-377987981 - k0pernikus
3
@k0pernikus最终成功让我的ansible部署使用npm ci,并将package-lock提交到代码库中。这使得我的前端开发人员能够进行部署。谢谢。 - MagicLAMP
5
@Jundl,请你开一个新问题,标题为“为什么npm ci不会使用缓存来安装Chromium依赖项?”,并附上你的package.json的最小、完整和可验证的实例。我会查看并回答你的问题。你可以在这里链接你的问题。 - k0pernikus
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接