热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么"npminstall"重写package-lock.json?

如何解决《为什么"npminstall"重写package-lock.json?》经验,为你挑选了8个好方法。

我刚刚升级到npm @ 5.我现在有一个package-lock.json文件,其中包含package.json中的所有内容.我希望,当我运行时npm install,将从锁定文件中提取依赖版本以确定应该在我的node_modules目录中安装什么.奇怪的是它实际上最终修改并重写了我的package-lock.json文件.

例如,锁定文件的typescript指定为版本2.1.6.然后,在npm install命令之后,版本更改为2.4.1.这似乎打败了锁定文件的整个目的.

我错过了什么?如何让npm真正尊重我的锁文件?



1> jotaen..:

更新3:正如其他答案所指出的那样,该npm ci命令在npm 5.7.0中引入,作为在CI上下文中实现快速且可重现的构建的另一种方式.有关详细信息,请参阅文档和npm博客.


更新2:更新和澄清文档的问题是GitHub问题#18103.


更新1:下面描述的行为在npm 5.4.2中得到修复:GitHub问题#17979中概述了当前预期的行为.


原始答案:在问题#16866中讨论的npm 5.1.0中的行为package-lock.json发生了变化.您观察到的行为显然是从版本5.1.0开始的npm.

这意味着只要找到一个新版本的依赖项,package.json就可以胜过.如果要有效地固定依赖关系,现在必须指定没有前缀的版本,例如,您需要将它们编写为而不是或.然后,和的组合将产生可重复的构建.要明确:单独不再锁定根级依赖项!package-lock.jsonpackage.json1.2.0~1.2.0^1.2.0package.jsonpackage-lock.jsonpackage-lock.json

无论这个设计决定是否合适都是有争议的,因此在问题#17979中对GitHub的混淆导致了持续的讨论.(在我看来,这是一个值得怀疑的决定;至少这个名字lock不再适用.)

还有一个注意事项:对不支持不可变包的注册表也有限制,例如直接从GitHub而不是npmjs.org提取包时.有关进一步说明,请参阅包锁的此文档.


真是一团糟!世界上最大的软件包管理器,但它没有关于它应该如何工作的文档.每个人都在猜测它应该做什么,它变成了一场意见之战.讨论是好的,但应该在释放到野外之前发生.在某些时候,某人需要进行最后的调用,然后才能实现,记录和发布.PHP是由委员会设计的,并且是ad-hoc'd一起,看看结果如何.我不愿意看到同样的事情发生在这个关键且广泛使用的工具上.
那么,使用package-lock有什么意义呢?我认为它会在不同的工作空间中创建相同的环境但事实证明它什么都不做
什么黑客是'npm update`呢?:○我有同样的感觉,`NPM install`更新DEPS,但我并不想相信它..但好像它是可悲的是真实的.不管怎么样还是有选择使用`NPM shrinkwrap`锁定DEPS,但肯定名称package-lock是不正确的,因为它不会冻结,也不会锁定依赖项.
"然后,package.json和package-lock.json的组合将产生可重现的构建." "package-lock.json"在这里有什么作用?如果没有使用版本前缀,单独"package.json"是否已经产生可重现的构建?
@JānisElmeris我认为package.json无法锁定深度依赖关系......
@LandonPoch不确定您对PHP的评论是指什么,但是Composer是一个比NPM(和yarn)更好的软件包管理器。听起来您可能有一段时间没有签出PHP了。
纱线没有这个问题。它会完全安装package-lock中列出的内容。
我真的很困惑......那么,1)我应该如何将完全锁定的包树部署到分段?只是"npm i --no-save"?2)如何在dev中更新软件包以准备新版本?"npm up --save"?老实说,我预计会有一个单独的命令从package-lock.json文件生成树

2> Ivan Shcherb..:

我发现将有一个新版本的npm 5.7.1使用new命令npm ci,它将package-lock.json仅安装

新的npm ci命令仅从您的锁文件安装.如果你的package.json和你的锁文件不同步,那么它将报告错误.

它的工作原理是丢弃你的node_modules并从头开始重新创建它.

除了保证你只获得锁文件中的内容之外,当你没有以node_modules开头时,它也比npm安装快得多(2x-10x!).

正如您可能从名称中获取的那样,我们希望它对持续集成环境来说是一个巨大的好处.我们还期望那些使用git标签进行生产部署的人将获得重大收益.


如果存在锁定文件,这应该是默认行为.
所以他们改变了我的工作方式,只是为了几个月后才把它带回来?

3> Gal Margalit..:

使用新推出的

npm ci

npm ci承诺给大型团队带来最大利益.让开发人员能够"签署"程序包锁定可以促进大型团队之间更有效的协作,并且能够准确安装锁定文件中的内容,有可能每月节省数十(如果不是数百)开发人员小时数,从而解放团队花更多的时间来建造和运送惊人的东西.

介绍npm ci更快,更可靠的构建


@ phouse512这是对的.我们几乎_only_使用`npm ci`,如果更新或安装新软件包,只使用`npm install`.
这对我来说似乎是对的吗?谁能确认吗?

4> Ahmad Abdelg..:

简答:

当package-lock.json存在时,它会否决package.json

当package.json被修改时,它会否决package-lock.json


这是一个可以解释事物的场景(使用NPM 6.3.0验证)

你在package.json中声明了一个依赖,如:

"depA": "^1.0.0"

然后你这样做,npm install它将生成一个package-lock.json:

"depA": "1.0.0"

几天后,一个较新的次要版本的"depA"被释放,比如说"1.1.0",那么下面的说法是正确的:

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed 
             # (i.e. when package-lock.json exists, it overrules package.json)

接下来,您手动将package.json更新为:

"depA": "^1.1.0"

然后重新运行:

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0" 
            # so it would throw an error 

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)


这确实是“锁定”文件的预期行为。显然,较旧版本的NPM并非如此。
@LahiruChandima它并不真正跟踪更新。除非npm install不满足package.json的要求,否则它将使用package-lock.json的锁定版本,在这种情况下,它将安装package.json并相应地重建package-lock.json。如果您以某种方式更改了package.json,以使现有的package-lock仍然满足更新后的package.json,它将继续使用该package-lock

5> Daniel Tonon..:

使用npm ci命令而不是npm install.

"ci"代表"干净安装".它将基于package-lock.json文件而不是lenient package.json文件依赖项来安装项目依赖项.

它将为您的其他队友提供相同的构建,并且速度也更快.


ci是指“持续集成”,如在文档和博客文章中宣布该命令的内容所提及:http://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

6> Daniel Tonon..:

看来此问题已在npm v5.4.2中修复

https://github.com/npm/npm/issues/17979

(向下滚动到线程中的最后一条注释)

更新资料

实际在5.6.0中已修复。5.4.2中存在一个跨平台错误,导致该问题仍然存在。

https://github.com/npm/npm/issues/18712

更新2

在这里查看我的答案:https : //stackoverflow.com/a/53680257/1611058

npm ci 是现在安装现有项目时应使用的命令。


我正在使用5.4.2,它仍然导致在`npm i`时对package-lock.json的修改。例如,当我在不支持fsevents的机器上执行npm i时,将删除模块fsevents,然后当在不支持fsevents的计算机上再次执行npm i时,将模块重新添加。

7> Timothy Higi..:

将来,您将能够使用--from-lock-file(或类似)标志package-lock.json不修改它的情况下安装.

这对于可重复构建很重要的CI等环境非常有用.

有关该功能的跟踪,请参阅https://github.com/npm/npm/issues/18286.


@YevgeniyAfanasyev而不是那个标志,它被实现为`npm ci`,它也处理你的问题.

8> Matt..:

你可能有类似的东西:

"typescript":"~2.1.6"

在您的package.json哪个npm更新到最新的次要版本,在您的情况下2.4.1

编辑:来自OP的问题

但这并不能解释为什么"npm install"会改变锁定文件.锁文件不是要创建可重现的构建吗?如果是这样,无论semver值如何,它仍应使用相同的2.1.6版本.

回答:

这旨在锁定完整的依赖关系树.让我们说typescript v2.4.1需要widget ~v1.0.0.当你npm安装它抓住widget v1.0.0.稍后您的开发人员(或CI版本)会执行npm安装并获取typescript v2.4.1widget已更新为widget v1.0.1.现在您的节点模块不同步.这是package-lock.json阻止的.

或者更一般地说:

举个例子,考虑一下

包A:

{"name":"A","version":"0.1.0","依赖项":{"B":"<0.1.0"}}

包B:

{"name":"B","version":"0.0.1","依赖项":{"C":"<0.1.0"}}

和包C:

{"name":"C","version":"0.0.1"}

如果这些是注册表中唯一可用的A,B和C版本,那么将安装正常的npm安装A:

A@0.1.0 - B@0.0.1 - C@0.0.1

但是,如果发布了B@0.0.2,那么将安装新的npm安装A:

假设新版本没有修改B的依赖关系,则为A@0.1.0 - B@0.0.2 - C@0.0.1.当然,新版本的B可能包含新版本的C和任意数量的新依赖项.如果不希望这样的改变,A的作者可以指定对B@0.0.1的依赖.但是,如果A的作者和B的作者不是同一个人,那么A的作者就没有办法说当B完全没有改变时他或她不想拉入新出版的C版本.


OP问题2:让我看看我是否理解正确.您所说的是锁文件指定了辅助依赖项的版本,但仍然依赖于package.json的模糊匹配来确定顶级依赖项.那是准确的吗?

答:没有.package-lock锁定整个包树,包括中描述的根包package.json.如果typescript被锁定2.4.1在你的位置package-lock.json,它应该保持这种状态直到它被改变.并且让我们说明天typescript发布版本2.4.2.如果我签出你的分支并运行npm install,npm将尊重lockfile并安装2.4.1.

更多信息package-lock.json:

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

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

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

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

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

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

https://docs.npmjs.com/files/package-lock.json


但这并不能解释为什么"npm install"会改变锁定文件.锁文件不是要创建可重现的构建吗?如果是这样,无论semver值如何,它仍应使用相同的2.1.6版本.
我不明白.如果后续安装可能仍然进行升级,这是一个"锁定"文件?!
我遇到过同样的问题.在我们的CI/CD中,`package-lock.json`被拉下来然后我们运行`npm install`,但是`package-lock.json`文件被修改了,我们必须执行重置才能拉出接下来的变化
我认为他们开始时想把这个文件作为"信息"和"锁定",然后决定它只是一个"信息"文件.更好的名字是"package-info.json".我希望有一个"npm install -lock",它将从"package-lock.json"安装并忽略"package.json"
这就是我说的话.我的包锁文件说typescript@2.1.6但是当我运行npm install时,该条目被替换为typescript@2.4.1.
对我来说,这个答案并没有真正解决问题.特别是OP2的答案我无法重现; 事实上,npm 5.3.0在我的机器上的行为并不像这样.比方说,如果在`package.json`中使用`~2.1.6`指定了typescript,npm仍然会忽略锁文件中输出的内容.
推荐阅读
  • npm 发布 WhalMakeLink 包:链接管理与优化的新选择
    WhalMakeLink 是一个强大的 npm 工具,专为项目管理和优化而设计。它能够自动在项目的 README 文件中生成当前工程目录下所有子项目的链接地址,极大提升了开发效率和文档维护的便捷性。通过简单的 `npm init` 命令即可快速启动和配置该工具,适用于各种复杂项目结构。 示例演示了其基本用法和功能。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 优化Node.js项目:有效管理和清理依赖项
    在Node.js项目中,有效管理和清理依赖项是提升性能和安全性的重要步骤。为了确保项目中仅保留必要的库,应定期检查并移除`node_modules`目录下不再使用的包。同时,所有必需的依赖项都应在`package.json`文件中明确列出,以保证项目的可维护性和可复现性。此外,利用如`npm prune`等工具可以帮助自动化这一过程,进一步提高效率。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 基于Node.js、EJSExcel、Express与Vue.js构建Excel转JSON工具:首阶段——Vue.js项目初始化及开发环境配置
    在近期的一个H5游戏开发项目中,需要将Excel数据转换为JSON格式。经过调研,市面上缺乏合适的工具满足需求。因此,决定利用Node.js、EJSExcel、Express和Vue.js自行构建这一工具。本文主要介绍项目的第一阶段,即Vue.js项目的初始化及开发环境的配置过程,详细阐述了如何搭建高效的前端开发环境,确保后续功能开发的顺利进行。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • 在 HihoCoder 1505 中,题目要求从给定的 n 个数中选取两对数,使这两对数的和相等。如果直接对所有可能的组合进行遍历,时间复杂度将达到 O(n^4),因此需要考虑优化选择过程。通过使用哈希表或其他高效的数据结构,可以显著降低时间复杂度,从而提高算法的效率。具体实现中,可以通过预处理和存储中间结果来减少重复计算,进一步提升性能。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文深入探讨了原型模式在软件设计中的应用与实现。原型模式通过使用已有的实例作为原型来创建新对象,而不是直接通过类实例化。这种方式不仅简化了对象的创建过程,还提高了系统的灵活性和效率。具体来说,原型模式涉及一个支持克隆功能的接口或基类,子类通过实现该接口来提供具体的克隆方法,从而实现对象的快速复制。此外,文章还详细分析了原型模式的优缺点及其在实际项目中的应用场景,为开发者提供了实用的指导和建议。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 高效排序算法是提升数据处理速度的重要技术。通过优化排序算法,可以显著提高数据处理的效率和性能。本文介绍了几种常见的高效排序算法,如快速排序、归并排序和堆排序,并通过实例代码展示了它们的具体实现。实验结果表明,这些算法在大规模数据集上的表现尤为突出,能够有效减少数据处理时间,提升系统整体性能。 ... [详细]
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
author-avatar
张嫱的小屋_133
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有