【问题标题】:What is the point of putting npm's "package-lock.json" under version control?将 npm 的“package-lock.json”置于版本控制之下有什么意义?
【发布时间】:2018-02-20 04:43:17
【问题描述】:

将 npm 的 package-lock.json 置于版本控制之下有什么意义?根据我的经验,控制此文件源所带来的麻烦和困惑比效率提升要多。

每次添加/删除/修改任何节点模块的开发人员需要解决分支之间的冲突时,将package-lock.json 置于源代码控制之下都会导致头疼。特别是在 package-lock.json 可能长达数万行的复杂/大型应用程序上工作。即使只是删除 node_modules 并运行一个新的npm install 也会在包锁中产生巨大的变化。

关于包锁还有其他几个 SO 问题:

还有一个 GitHub 问题,其中包含大量关于包锁定的对话:

这让我认为仍然存在需要消除的广泛不确定性。

根据文档

package-lock.json 会为 npm 修改 node_modules 树或 package.json 的任何操作自动生成。

那么为什么要将自动生成的文件置于源代码管理之下?

上述 GitHub 问题详细说明了一些人如何响应与 package-lock.json 的混淆,将他们的 npm install 脚本更改为 rm -f package-lock.json && npm install,这也感觉不正确。

似乎package-lock.json 正在努力成为节点模块依赖项的确切版本的真相来源,但这不正是 package.json 所做的吗?解决此文件中的合并冲突的痛苦何时开始得到回报?

【问题讨论】:

  • 您的团队应该同意在每次代码更改时仅遵循 package-lock.json 中的“当前工作”模块版本,除非你们都同意需要升级当前模块。这样,package-lock.json 让每个人都知道需要哪个模块版本以及“当前正在使用”您的应用程序。

标签: npm version-control package.json package-lock.json


【解决方案1】:

IMO package-lock.json(或yarn-lock.json)应始终致力于源代码控制。除了合并/变基冲突(yarn 顺便说一句,您可以通过yarn install mid-rebase 自动解决问题),这是您拥有该提交的代码将在一个全新结帐并安装。

【讨论】:

    【解决方案2】:

    创建一个 .gitattributes 条目:

    # common settings that generally should always be used with your language specific settings
    
    # Auto detect text files and perform LF normalization
    * text=auto
    
    #
    # The above will handle all files NOT found below
    #
    
    #*.svg text
    *.lock binary
    

    然后,当您合并时,您只需选择版本与代码合并。以为这样你可能会遇到包冲突。

    我们通过在构建过程中检查版本来缓解这种情况。

    【讨论】:

    • .gitattributes 最后一行中的*.lock 似乎没有意义,因为这是关于package-lock.json。你的意思是package-lock.json binary 吗?
    • 我真的很喜欢这个答案作为一个一般概念,但像@Adrian 一样,我认为 *.lock 二进制文件的使用并不是你想要的。在阅读git-scm.com/docs/gitattributes 之后,我将尝试在我的 .gitattributes 文件中使用 *lock.json -diff 来查看它是否有效。此外,带有 * text=auto 的行与问题无关。
    【解决方案3】:

    根据我的经验,package-lock.json 置于版本控制之下是没有意义的。它使管理大型合并/变基成为一场噩梦。但是,在某些情况下,package-lock 可能非常有用

    最近(2017/10/10)moment.js 引入了breaking changes in a minor version update。意思是如果一个人要在没有 package-lock.json 的情况下发货,并且在他们的 package.json 中有这样的东西:

    "moment": "^2.12.0"

    2.19.0 版中引入的一些重大更改会悄悄地渗透到您的代码中,几乎没有任何痕迹。

    这就是为什么在切割一个分支以作为候选版本之后,以下几点至关重要:

    • 从 .gitignore 中移除 package-lock.json
    • 运行npm install 生成一个package-lock.json
    • 使用此包锁进行测试、质量检查、部署

    这可确保您的 npm 模块版本将保持锁定在已测试的相同版本上。

    【讨论】:

    • 锁定版本,这不是npm shrinkwrap 的用途吗?
    • 在次要版本更新中进行重大更改不是大忌吗?
    • 没错,但这只是君子之约。在现实世界中并不总是如此
    • 投反对票。锁定文件应始终处于版本控制中,否则您将无法进行可重复的构建。
    • 我同意,锁文件应该提交给版本控制。然而,在运行npx create-react-app 之后,我现在正盯着一个有 38k 行的package-lock.json。那是 38 000 行,大小超过 1kb。这对于版本控制来说太大了。
    猜你喜欢
    • 2022-09-26
    • 2017-10-30
    • 2019-05-17
    • 2018-03-21
    • 2017-12-14
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多