我是否提交了由npm 5创建的package-lock.json文件?

rin*_*t.6 1164 git version-control lockfile node.js npm

npm 5今天发布,其中一项新功能包括创建package-lock.json文件的确定性安装.

这个文件应该保存在源代码管理中吗?

我假设它类似于,yarn.lock并且composer.lock两者都应该保留在源代码控制中.

vin*_*e77 1380

是的,package-lock.json旨在检查源代码管理.如果你使用的是npm 5,你可能会在命令行上看到这个:created a lockfile as package-lock.json. You should commit this file.根据npm help package-lock.json:

package-lock.json为npm修改node_modules树或的任何操作自动生成package.json.它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖性更新.

此文件旨在提交到源存储库,并用于各种目的:

  • 描述依赖关系树的单个表示,以确保队友,部署和持续集成能够安装完全相同的依赖关系.

  • 为用户提供一个"时间旅行"到以前状态的工具,node_modules而无需提交目录本身.

  • 通过可读的源代码控制差异来促进树更改的更大可见性.

  • 并通过允许npm跳过以前安装的软件包的重复元数据解析来优化安装过程.

一个关键的细节package-lock.json是它无法发布,如果在顶级包以外的任何地方找到它将被忽略.它与npm-shrinkwrap.json(5)共享一种格式,它本质上是同一个文件,但允许发布.除非部署CLI工具或使用发布过程生成生产包,否则不建议这样做.

如果两个package-lock.jsonnpm-shrinkwrap.json存在于包的根,package-lock.json将被完全忽略.

  • 就我个人而言,我现在不得不求助于将`package-lock.json`添加到我的`.gitignore`中...它给我带来了比解决它们更多的问题.当我们合并或重新绑定时,它总是会发生冲突,当合并导致`package-lock.json`在CI服务器上被破坏时,必须坚持修复它只是一件痛苦的事. (107认同)
  • 在什么样的项目中提交文件实际上有帮助?semver和package.json的重点是不需要注意更新的兼容依赖项. (60认同)
  • 关键词是"不应该" - 但在实践中,人们并不完全遵循semver.这就是为什么你可以一起使用package-lock.json和package.json来更新包,但仍然确保每个开发人员和每个部署的应用程序都使用相同的依赖树. (39认同)
  • @trusktr:Sindre Sorhus [推荐使用](https://twitter.com/sindresorhus/status/878240818363981827)"用于应用程序的Lockfiles,但不用于包." (24认同)
  • 另一件事是,在NPM上发布时会忽略package-lock.json,因此如果开发人员将它用于库开发人员,那么他们将最小化他们从更新的依赖版本中捕获回归的可能性,因此将通过最终用户的错误.出于这个原因,不使用库文件的锁文件增加了运送更少错误的机会. (18认同)
  • @StefanZCamilleri在这里也一样,更不用说它有一种倾向,即在代码审查工具中占据任何差异的前几个屏幕高度.就目前我所看到的而言,屁股的巨大痛苦几乎没有任何好处. (12认同)
  • 如果我正确理解这一切意味着什么......因为当您发布包时文件会被忽略......这种"可再现性"的价格很高.也就是说......虽然我有自己和我的共同开发人员可以通过签出来源工作的东西.安装我的publsihed包的人可能会得到完全不同的东西.所以...基本上我和我的开发人员可能没有注意到依赖项更改是否会破坏,但是我们的用户安装已发布的软件包. (8认同)
  • @MiguelReyes 不要使用 `npm install`,而是使用 `npm ci`。`npm ci` 永远不会改变 package-lock.json 并在 package.json 和 package-lock.json 不同步时抛出错误。然后,您可以在您的存储库中使用 package-lock.json 并从已知工作依赖项的保护中受益,而无需处理变异的锁文件。 (7认同)
  • 我不这样做.我每次生成时都会删除此文件.如果有任何问题,我删除node_modules /目录并再次运行npm install.我甚至将每个版本更改为依赖项和devDependencies中的*.我的态度是,如果有问题,解决它.我宁愿使用所有最新版本.任何过时的东西都让我感到恶心. (6认同)
  • 为什么不通过去掉脱字符号和波形符(^ 和 ~)来硬编码依赖版本? (6认同)
  • 我也 gitignore 这个文件,因为克隆一个 repo 并在它上面运行 `npm install` 会立即显示 `package-lock.json` 和 `git status` 中有更改。即使文件中没有任何变化,我认为它只是_touches_文件。我认为在 git 中使用它只会让开发人员感到困惑。此外,这是一个巨大的文件,谁甚至会在依赖项中“找到错误”,祝你好运! (4认同)
  • @EmdadulSawon 这不是一个糟糕的设计。它的目的是锁定已知的工作状态。如果没有它,您可能会因依赖项更新中断而遇到应用程序中断的情况。package-lock.json 的内容取决于您运行它的时间,因此在不同时间生成它会产生不同的输出(取决于依赖项的可用版本)。开发应用程序时,您永远无法确定您的应用程序是否可以与依赖项的未来版本一起使用,因为即使是补丁和次要版本也可能会破坏您的应用程序。提交锁定文件并使用“npm ci”增加了可靠性。 (4认同)
  • @trusktr 我想我们可能要考虑在这个答案中添加关于包与应用程序的警告——你怎么看? (3认同)
  • @BrianHaak 这是一个要问的新问题,而不是评论。另外,`npm 链接`。 (3认同)
  • @Thor84no 从那以后我就改用 Yarn。有一些轻微的非阻塞不兼容问题,但与 npm 相比它的速度非常快 (3认同)
  • 一些开发人员不喜欢为他们的库包提交锁定文件,因为他们相信他们可以在用户之前发现和修复依赖关系的问题。正如帖子中指出的那样,这是一个有缺陷的论点 [“Lockfiles 应该在所有项目上提交”](https://yarnpkg.com/blog/2016/11/24/lockfiles-for-all/)。不提交您的锁定文件也会使新用户更难为您的库做出贡献。 (3认同)
  • 如果这个文件是自动生成的,我们为什么要提交它?为什么npm不能根据我的package.json重新生成。多么糟糕的设计啊! (3认同)
  • 很棒的发现,谢谢!我迫不及待地想在下周为我的项目尝试 npm 5,一直在阅读有关它的精彩内容。 (2认同)
  • 但是是否打算将其签入顶级应用程序的源代码控制中?或者还签入库包的源代码管理? (2认同)
  • @mikermcneil图书馆的锁文件问题似乎没有达成共识.例如,[James Kyle建议](https://yarnpkg.com/blog/2016/11/24/lockfiles-for-all/)为库/包提交锁定文件以使贡献更容易. (2认同)
  • @ vine77侧面的问题是:"我们应该在`.gitattributes`中将它标记为二进制文件,以便不查看更改吗?" 编辑:实际上找到了部分答案[HERE](https://github.com/yarnpkg/yarn/issues/1776#issuecomment-269539948) (2认同)
  • 是的,您可以包含它,但如果使用了已解析的字段,请添加相对 URL 而不是引用 npmjs.org 以支持防火墙后面的内部存储库。 (2认同)
  • 每次我运行 `npm install` 时。`integrity` 字段中的值会更改,即使包的版本是保存。知道这是怎么发生的吗? (2认同)
  • @Dennis Yarn博客文章中的推理是非常短视的,不应依赖。它仅考虑在依赖项中引入错误的情况,该错误将在以后的发行版中修复,而无需更改库。不幸的是,在现实生活中,并非所有的依赖关系问题都归因于上游错误,这些错误会自行消失而无需采取任何措施。 (2认同)
  • 我同意这个答案,即它“打算”被签入。但是,签入它的另一个问题是它目前不尊重平台的差异。例如,当我的队友签入它时,因为它是在 Mac 上构建的,但它在 Windows 上无法正常工作。https://github.com/npm/cli/issues/558 和 /sf/ask/4177961021/ windows-node-gyp-重建 (2认同)

xer*_*r0x 100

是的,它打算被签入.我想建议它获得自己独特的提交.我们发现它给我们的差异增加了很多噪音.

  • 讨论它是否应该被检入你的源代码库是公平的,但是将这个文件发布到npm并不是真的有争议 - 你必须在你的npm注册表中包含你的package-lock.json或你的shrinkwrap文件.如果不这样做,您发布的包将受到第1代依赖项依赖性的未经修改的更改.你不会注意到这是一个问题,直到其中一个第二代依赖发布了一个重大变化,你发布的包被神秘地破坏了.这个package-lock.json文件是为解决这个问题而创建的. (13认同)
  • @BetoAveiga by noise我的意思是使用package-lock.json的提交可以有很多行的节点包版本,该提交中的任何其他工作都会被隐藏. (7认同)
  • @guerillapresident 据我了解,您部分正确。将此文件发布到 npm 没有争议。你不能发布它。 (7认同)
  • 我通常将包装安装与其他工作分开.我永远不需要像"已安装的柴和摩卡"这样的提交,因为我已经知道改变了什么. (6认同)
  • @guerillapresident 您无法发布 package-lock.json 文件:https://docs.npmjs.com/files/package-lock.json (3认同)
  • 在使用中继和分支的SCM系统上工作时,有关``package-lock.json``文件的任何建议?我正在对需要合并到trunk的分支进行一些更改...我现在必须(以某种方式)解决两个``package-lock.json``文件之间的冲突吗?这感觉很痛苦. (2认同)

Xin*_*Xin 50

是的,最佳做法是办理登机手续

我同意在看到差异时会引起很多噪音或冲突.但好处是:

  1. 保证每个包的完全相同的版本.当在不同时间在不同环境中构建时,这部分是最重要的.你可以使用^1.2.3你的package.json,但你怎么能保证每次都npm install将搭载相同的版本在你的dev的机器和构建服务器,尤其是那些依赖间接包?好吧,package-lock.json将确保.(借助于npm ci安装基于锁文件的包)
  2. 它改善了安装过程.
  3. 它有助于新的审计功能npm audit fix(我认为审计功能来自npm版本6).

  • +1表示`npm ci`。人们经常提到,`package-lock.json`允许确定性地安装软件包,但几乎从来没有提及促进这种行为的命令!许多人可能错误地认为`npm install`会完全安装锁定文件中的内容... (11认同)
  • 谢谢你!仅当您使用“npm ci”时,提交 package-lock.json 才有意义。您的团队/首席开发人员可以决定何时更新。如果每个人都随意提交它,那么它就没有任何意义,而且只会在您的存储库中制造噪音。[NPM 文档](https://docs.npmjs.com/files/package-lock.json) 应该使这一点更加清晰。我认为大多数开发人员只是对这个功能感到困惑。 (2认同)

Deu*_*unz 33

我不在我的项目中提交此文件.重点是什么 ?

  1. 它是生成的
  2. 这是gitlab中使用gitlab-ci.yml构建的SHA1代码完整性错误的原因

虽然我从来没有在我的package.json中使用^用于libs,因为我对它有糟糕的经历:)

问候.

  • 我希望这可以从npm文档中进一步阐述 - 通过不提交`package-lock.json`来概述你失去的具体内容是有用的.某些回购可能不需要拥有它的好处,并且可能更喜欢在源中没有自动生成的内容. (9认同)
  • 您可能不会在package.json中使用^,但是可以确定您的依赖项没有使用它吗? (4认同)
  • 我可以看到它如何用于调试(例如两个锁之间的差异)以帮助解决问题。我想它也可以用来防止这类事情,但在共享存储库中使用它也可能会很痛苦,因为它可能会遇到合并冲突。首先,我想让事情保持简单,我将单独使用 package.json,直到我发现确实需要 package-lock.json。 (2认同)
  • 如果您的项目中忽略了package-lock.json,可能会导致版本冲突、包意外升级、开发环境与生产环境差异等问题。 (2认同)

Raz*_*aza 29

在做git diff时,人们抱怨噪音:

git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'
Run Code Online (Sandbox Code Playgroud)

我做的是使用别名

alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"
Run Code Online (Sandbox Code Playgroud)

  • 我有 `gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }` 在我的 .bashrc 中,而不是别名。 (2认同)

k0p*_*kus 28

是的你应该:

  1. 提交package-lock.json
  2. 使用npm ci而不是npm install在CI和本地开发计算机上构建应用程序时

npm ci工作流程需要的存在package-lock.json


npm install命令的一个很大的缺点是它的意外行为,它可能会使突变package-lock.json,而npm ci仅使用锁定文件中指定的版本并产生错误

  • 如果package-lock.jsonpackage.json不同步
  • 如果package-lock.json缺少a。

因此,在npm install本地运行,尤其是。在拥有多个开发人员的大型团队中,可能会导致内发生许多冲突,因此package-lock.json开发人员决定完全删除该冲突package-lock.json

但是,有一个强大的用例可以信任项目的依赖项在不同机器上以可靠的方式重复解决。

从中package-lock.json您可以确切地得到:一个已知的工作状态。

过去,我有没有package-lock.json/ npm-shrinkwrap.json/ yarn.lock文件的项目,由于随机依赖项的更新中断,因此有一天的构建会失败。

这些问题很难解决,因为您有时不得不猜测最新的工作版本是什么。

如果要添加新的依赖项,则仍然可以运行npm install {dependency}。如果要升级,请使用npm update {dependency}npm install ${dependendency}@{version}并提交已更改的package-lock.json

如果升级失败,则可以恢复到上一个​​已知的工作状态package-lock.json


引用文档NPM

强烈建议您将生成的程序包锁定提交给源代码控制:这将允许您团队中的其他任何人,您的部署,您的CI /持续集成以及在包源中运行npm的其他任何人都可以在程序包源中安装完全相同的依赖树你在继续发展。此外,这些更改的差异是人类可读的,并且会通知您npm对您的node_modules所做的任何更改,因此您可以注意到是否有任何传递性依赖项被更新,提升等。

并且关于vs 之间npm cinpm install区别

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

注意:我在这里发布了类似的答案

  • 这个答案值得更多功劳,尤其是使用npm ci时。使用此方法可以缓解人们在使用包锁定时遇到的大多数问题。 (4认同)
  • 我发现在 package.json 中使用固定版本(没有插入符号或波浪号)是一个更干净的选择。这使我免于“有一天其构建会失败,因为随机依赖项发生了重大更新”之类的问题。尽管它留下了孩子的依赖性导致同样问题的可能性。 (4认同)
  • 我们应该始终使用 npm ci 仍然相关吗?从文档看来这是不正确的。**npm install** "此命令安装一个包及其依赖的任何包。如果该包具有包锁、npm Shrinkwrap 文件或纱线锁文件,则依赖项的安装将由该包驱动,遵循以下优先顺序:“ **npm ci** “如果 node_modules 已经存在,它将在 npm ci 开始安装之前自动删除。” 当然,npm ci 应该用作 CI/CD 过程的一部分,但在开发机器上似乎过多? (2认同)
  • 太感谢了!我知道必须有一个只读样式的“npm i”。如果根据文档,锁定文件用于将我同步到之前的更改,但“npm i”总是会写入 package-lock.json,然后呢?现在对我(正在同步的)进行更改检查没有意义。从现在开始我将尝试使用“npm ci”,看看问题是否消失。 (2认同)
  • 这应该是公认的答案。使用“npm i”可能会导致“package-lock.json”在每次不同的开发人员运行它时发生更改。完全抵消了拥有它的好处。 (2认同)

Mat*_*ley 20

是的

\n

答案是肯定的,绝对总是将你的锁文件提交到 git。

\n

与 git 哈希的类比

\n

如果您使用 git,则应该使用锁定文件,因为它们具有相同的目的:

\n
    \n
  • git哈希保证git 存储库中文件内容的稳定性。
  • \n
  • 锁文件保证了node_modules内容的稳定性。
  • \n
\n

因为...

\n
    \n
  • git 存储库中的文件可能会随着时间而改变,但git 哈希指的是文件的精确快照。
  • \n
  • npm 注册表中的npm 包可能会随着时间的推移而改变,但锁定文件指的是依赖项的精确快照。
  • \n
\n

来自包管理器本身

\n

包管理器供应商明确表示您应该提交锁定文件

\n

新项目管理

\n
\n

强烈建议您将生成的包锁提交到源代码管理...

\n
\n

https://docs.npmjs.com/cli/v6/configuring-npm/package-locks

\n

什么时候npm没有锁定文件安装时,它会清楚地告诉您提交锁定文件:

\n
npm notice  created a lockfile as package-lock.json. You should commit this file.\n
Run Code Online (Sandbox Code Playgroud)\n

\n
\n

应在所有项目上提交锁定文件

\n
\n

https://classic.yarnpkg.com/blog/2016/11/24/lockfiles-for-all/

\n

PNPM

\n
\n

您应该始终提交锁文件 ( pnpm-lock.yaml)。

\n
\n

https://pnpm.io/git

\n

原因

\n

一致性

\n

单个提交应该永远相同,并且其构建输出不应随着时间的推移而改变。

\n

来自 npm:

\n
\n

[锁定文件] 将允许您的团队中的其他人、您的部署、CI/持续集成以及在包源中运行 npm install 的任何其他人获得与您正在开发的完全相同的依赖关系树。

\n
\n

从纱线:

\n
\n

如果您不\xe2\x80\x99t 存储最终安装的版本,则某人可能会安装同一组依赖项,并根据安装时间而最终获得不同的版本。这可能会导致 \xe2\x80\x9cWorks On My Machine\xe2\x80\x9d 问题,应该避免。

\n
\n

变更的可追溯性

\n

当某些事情发生变化时,您希望 git 跟踪该变化。

\n

来自 npm:

\n
\n

[使用锁定文件] [安装] 更改的差异是人类可读的,并且会通知您 npm 对您的 所做的任何更改node_modules,因此您可以注意到是否更新、提升了任何传递依赖项等。

\n
\n

稳定安全

\n

避免引入错误和漏洞。

\n

从纱线:

\n
\n

由于软件包作者是人,他们可能会犯错误,因此他们可能会在次要版本或补丁版本中发布意外的重大更改。如果您在无意中安装了此重大更改,则可能会产生不良后果,例如破坏生产中的应用程序。

\n
\n
\n

如果包作者是恶意的,或者受到恶意者的攻击并发布了错误的版本,您不希望该代码在您不知情的情况下最终运行。

\n
\n

常见的反对意见

\n

“毫无意义”

\n

这是“无知论证”,是一个逻辑谬误。换句话说,“我不知道原因,所以没有”。

\n

“已生成”

\n
\n

如果这个文件是自动生成的,我们为什么要提交它?为什么npm不能根据我的package.json重新生成。

\n
\n

来自评论

\n

回应:生成并不是缺陷。生成 Git 提交哈希值;我们不应该使用git吗?事实是,锁文件不是从 package.json确定性生成的,因为它容易受到时间和npm 注册表中包的状态的影响。为了稳定性,它是快照。

\n

“这会导致合并冲突”

\n

解决签入锁定文件中的合并冲突是一个负担。

\n

来自 npm:

\n
\n

从 开始,这些冲突可以通过手动修复任何冲突然后再次运行来npm@5.7.0解决。package.jsonnpm install [--package-lock-only]

\n
\n

从纱线:

\n
\n

当锁定文件中存在\xe2\x80\x99s合并冲突时,Yarn将在运行时自动为您处理冲突解决方案yarn install

\n
\n

https://engineering.fb.com/2017/09/07/web/announcing-yarn-1-0/

\n

来自 pnpm:

\n
\n

pnpm 可以自动解决pnpm-lock.yaml. 如果存在冲突,只需运行pnpm install并提交更改即可。

\n
\n

因此,所有包管理器都会自动解决锁定文件合并冲突。在旧版本中可能不是这样,但现在是这样。

\n

唯一失败的情况是其package.json本身存在冲突,因为您无法从无效的package.json. 您必须手动解决这些冲突,因为无论如何您都必须这样做

\n

“合并冲突会干扰 PR 和 MR”

\n
\n

使用锁定文件会大大增加合并一个 PR 导致第二个 PR 与基础分支发生冲突的可能性。

\n
\n

https://docs.renovatebot.com/noise-reduction/#lock-file-considerations

\n

这是真实的。Git 提供程序(GitHub、GitLab 等)不会自动解决锁定文件冲突,因此这可能会增加合并的负担。然而,在权衡这一弊端时,请了解锁定文件通常不会更改;它们仅在package.jsondeps 更改时或开发人员专门更改文件或安装的文件时更改node_modulesdeps 时,它们才会更改。

\n

“它会发出不同的噪音”

\n

如果差异工具显示锁文件差异,则会产生很多噪音。

\n

这是事实,但这是一个工具问题,许多工具可以很好地处理(例如自动最小化、分页或虚拟滚动)。如果您根本不想看到锁定文件差异,请尝试git diff -- . \':(exclude)yarn.lock\',或者将文件标记为二进制文件.gitattributes(但是,如果这对您很重要,您将看不到它的差异)。

\n

“精确的版本就足够了”

\n
\n

为什么不通过去掉脱字符号和波形符(^ 和 ~)来硬编码依赖版本?

\n
\n

评论

\n

这个想法是不使用范围package.json可以完成与使用锁定文件相同的事情。

\n

这是错误的。即使您指定了确切的版本,您的依赖项也有自己的依赖项,这些依赖项可能使用其版本的范围,而不是确切的版本。因此,这最终不会锁定整个依赖关系树,而只会锁定其顶部。

\n

“应用程序有锁定文件,库没有锁定文件”

\n

这种反对意见的例子:

\n\n

人们的观点是,图书馆需要对前沿部门做出反应,并且没有锁文件支持这一点。

\n

从纱线:

\n
\n

有些人想知道为什么库应该使用锁文件......在开发库时使用锁文件会产生一种错误的安全感,因为您的用户可能安装与您不同的版本。

\n

这在逻辑上似乎是有道理的,但是让\xe2\x80\x99s 更深入地研究这个问题。

\n
\n

纱线文章深入探讨,以消除这种反对意见。请阅读它。

\n

此论点中的一个常见错误是认为如果不提交锁文件,它就不存在。实际上,它仍然在您的计算机上,锁定您的依赖项。gitignoring the lockfile 并不能改善这种情况。

\n

如果库维护者希望不断测试兼容性,那么他们应该在安装和构建库之前删除其锁定文件(无论锁定文件是否签入!)。与签入锁定文件的唯一区别是,发生这种情况时,您可以持久记录 node_modules 的状态,因此可以在将来重现它。

\n

有像greenkeeperrenovate-bot这样的机器人可以做到这一点。Greenkeeper 提倡检查锁文件(Greenkeeper 和 Lockfiles:天作之合),renovate-bot 不表达任何意见,但会提交锁文件(如果存在)

\n

“不同系统生成的锁定文件不同”

\n

这是提到的一个声明(例如此处):不同的操作系统生成不同的锁定文件内容。如果是这种情况,则这是一个错误。

\n

然而,不同版本的npm(或任何包管理器)可能会产生不同的锁定文件输出。我还没有证实这一点,但假设如果是这样,那么为稳定付出的代价很小。为了解决这个问题,贡献者需要使用nvm之类的工具来切换他们的包管理器版本。

\n

“锁定文件可能存在安全风险”

\n

请参阅Snyk - 为什么 npm 锁定文件可能成为注入恶意模块的安全盲点

\n

这是一个真正的风险。具有锁定文件的公共项目可能会收到带有锁定文件内容的恶意 PR,一旦分支被拉出并安装,这些内容可能会危及维护人员的计算机。

\n

通过 CI 检查(例如lockfile-lint或简单的npm cior yarn --immutable(在 Yarn 1 上))来防御这种情况yarn --frozen-lockfile,并且可能ignore-scripts在您的npmrc.

\n

每当您安装包含不受信任代码的软件包时,就会存在这种风险。

\n

综上所述

\n

始终提交锁定文件。

\n


小智 15

是的,您可以提交此文件.来自npm的官方文档:

package-lock.jsonnpm修改node_modules树或任何操作的任何操作自动生成package.json.它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖性更新.

此文件旨在提交到源存储库[.]

  • 安装不会总是更新node_modules,因此更新package-lock.json吗? (11认同)
  • 不,您可以运行 `npm ci` 从 package-lock.json 进行安装 (3认同)

Nik*_*kar 10

是的, commit 是标准做法package-lock.json

提交的主要原因package-lock.json是项目中的每个人都在同一个包版本上。

优点:

  • 如果您遵循严格的版本控制并且不允许自动更新到主要版本以避免第三方软件包中向后不兼容的更改,那么提交 package-lock 会有很大帮助。
  • 如果你更新一个特定的包,它会在 package-lock.json 中更新,并且每个使用存储库的人在接受你的更改时都会更新到该特定版本。

缺点:

  • 它可以让你的拉取请求看起来很难看:)

npm install不会确保项目中的每个人都使用相同的包版本。npm ci将对此有所帮助。

  • 如果您使用“npm ci”而不是“npm install”,这些缺点就会消失。 (7认同)
  • 范围有点小,但这里有[来自@k0pernikus的优秀建议的更多信息](/sf/ask/3674973221/ Between-npm-install-and-npm-ci )。 (2认同)
  • “项目中的每个人都将使用相同的包版本,您所要做的就是 npm install” 不正确,您需要使用“npm ci”代替 (2认同)

Bal*_*bay 9

全局禁用 package-lock.json

在终端中输入以下内容:

npm config set package-lock false
Run Code Online (Sandbox Code Playgroud)

这真的像魔术一样对我有用

  • 对我来说,这将是一个负面消息,这有点好笑。npm 社区不能接受 package-lock.json 自动生成是不好的社区参与。你不应该做会影响团队流程的事情。它应该是一个启用选项,而不是强制选项。有多少人只是执行“git add *”,甚至没有注意到它并搞砸了构建。如果您有任何基于合并的流程,我知道 git flow 就像使用它的人的圣经一样,这是行不通的。你不能在合并时生成!npm 版本控制已损坏,包:1.0.0 应该是确定性的! (7认同)
  • 这个答案应该被否决,因为它*没有(试图)回答这个问题*。 (5认同)
  • 为什么这被否决了?这显然是禁用不起作用的功能的合法方式。虽然它本身并没有回答问题,但它提出了这个问题。即它不再需要回答。对我竖起大拇指:) (3认同)
  • 这会创建包含内容为“package-lock=false”的“~/.npmrc”(至少在我的 macos 上),并且可以在任何特定项目中与“node_modules/”(例如“echo 'package-lock=false')一起完成相同的操作>> .npmrc` (2认同)
  • 它被否决的原因是因为您只是禁用了一项功能。 (2认同)

A-3*_*312 5

所有答案都说“是”,但这也取决于项目,文档说:

\n
\n

package-lock.json 的一个关键细节是它无法发布,如果在顶级包以外的任何地方找到它,它将被忽略。

\n
\n

这意味着您不需要在 npm 上发布您的package-lock.jsonfor 依赖项,但需要package-lock.json在存储库中使用来锁定测试依赖项的版本,构建依赖项\xe2\x80\xa6

\n

但是,如果您使用lerna来管理具有多个包的项目,则应该package.json仅将其放在存储库的根目录中,而不是在使用npm init. 你会得到类似的东西:

\n
.git\nlerna.json\npackage.json\npackage-lock.json        <--- here\npackages/a/package.json\npackages/a/lib/index.js\npackages/b/package.json\npackages/b/lib/index.js\n
Run Code Online (Sandbox Code Playgroud)\n