【问题标题】:Should the package-lock.json file be added to .gitignore? [duplicate]是否应该将 package-lock.json 文件添加到 .gitignore 中? [复制]
【发布时间】:2018-07-09 12:22:15
【问题描述】:

要锁定安装在项目上的依赖项的版本,命令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. 是否存在我们必须不得这样做的特定情况?

【问题讨论】:

    标签: javascript node.js git npm gitignore


    【解决方案1】:

    不,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.json 和@987654336 会产生错误@ 不同步。

    另外,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,不应该通过上述原因实现。


    quote npm doc:

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

    关于difference between npm ci vs npm install

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

    【讨论】:

    • @MagicLAMP 您应该在构建服务器上使用npm ci 而不是npm install。那么你的问题就会消失。
    • webpack Github 上查看.gitignore 确实包括package-lock.json...
    • @JSStuball webpack 使用 yarn 而不是 npm。它的存储库中有一个 yarn.lock(相当于 package-lock.json)。另见:github.com/webpack/webpack/pull/6930#issuecomment-377987981
    • @k0pernikus 终于让 npm ci 处理我的 ansible 部署,并将包锁定提交到存储库。这允许我的前端开发人员部署东西。谢谢。
    • @Jundl 您能否以“为什么 npm ci 不使用缓存来处理 chromium 依赖项?”的形式提出一个新问题?并参考您的 package.json 的最小、完整和可验证的示例?那时我会看看。您可以在此处链接您的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2020-06-26
    • 2021-03-21
    • 2017-11-17
    • 2017-11-16
    • 1970-01-01
    • 2019-09-08
    • 2019-02-16
    相关资源
    最近更新 更多