【问题标题】:package-lock.json file, package with "optional": truepackage-lock.json 文件,带有“可选”的包:true
【发布时间】:2019-11-27 01:40:28
【问题描述】:

我的一个同事的 PR 包含一个 package-lock.json 更新,其中添加了"optional": true

 "minimist": {
   "version": "0.0.8",
   "bundled": true,
-  "dev": true
+  "dev": true,
+  "optional": true
 },
 "minipass": {

即使在谷歌搜索之后,我也不确定这意味着什么。有人可以解释一下吗?

【问题讨论】:

标签: node.js npm


【解决方案1】:

来自https://docs.npmjs.com/files/package-lock.json#optional

如果为真,那么这个依赖要么是顶层模块的可选依赖,要么是一个传递依赖。这对于既是顶层的可选依赖又是顶层非可选依赖的传递依赖的依赖是错误的。

合并此更改是安全的。

您看到此更改的原因很可能是因为npm slightly changed how package-lock.json is structured in version 6.6。你的伙伴基本上是在先前使用 npm 6.5- 生成的 package-lock.json 上使用 npm 6.6+ 运行 npm install

通过确保团队中的每个人都使用最新版本的npm,您应该能够避免此类问题。

【讨论】:

  • 在我看来,这不是 npm 6.6+ 消失的东西
【解决方案2】:

从依赖项中删除一个包后,它的依赖项在package-lock.json 中标记为"optional": true

手动或手动移除此类包通常是安全的

$ rm -rf package-lock.json node_modules/
$ npm install

但是,这不是 100% 安全的,因为某些软件包会更新到较新的版本。

【讨论】:

  • 请参考您的:“不是 100% 安全,因为某些软件包会更新到较新的版本”。拥有包管理器的全部意义在于能够克隆、安装并拥有一个工作系统。全面采用相同的工作系统。如果你的项目依赖于一些旧版本的包,只是因为npm i最近没有运行,你就错了。
  • @tao 考虑到上游软件包发布的频率有多高,并且其中一些忽略了 SemVer,我同意运行 npm i 并不是 100% 安全的观点。
  • @villasv 使用节点的目的是让您可以进行持续集成。这意味着:“您将项目部署在服务器上,运行 npm i 并且它可以工作”。如果你的构建依赖于你在npm i 之后对你的包所做的更改,那么你在 80 年代后期的开发过程几乎是一样的:你需要将本地机器上的准确副本上传到服务器上才能正常工作。在这种情况下,您根本不应该使用节点。您可以简单地将所有需要的供应商资产放在一个文件夹中,然后从那里加载它们。
  • CI 方法中没有任何地方假设您应该运行npm i。事实上,npm 维护者甚至为我们提供了一个真正安全的替代方案:npm ci,正如 de docs 所提到的,它是为 CI 环境设计的。现在,如果您认为这是否理想,您可以提出异议,但这是您必须与 NPM 团队本身讨论的问题。
  • 假设即使是不受您控制的库的补丁版本也总是 100% 安全且兼容,这是幼稚的,最终会破坏您的网站。上游开发人员是人,他们会犯错误。每次升级,无论多么小,都必须进行测试。盲目地运行npm i,除非您将所有依赖项都固定到特定版本,否则绝不是一个好主意。希望您在 CI 管道中进行了测试,以至少在其投入生产之前发现可能出现的任何问题。
【解决方案3】:

其中一个原因是:

一些 npm 包可能需要依赖包(例如 minimist)才能在不同的操作系统中工作。 NPM 在 npm install 上将此包标记为可选,如果有的话,根据您使用的操作系统,它不是必需的。

请检查以下问题:

打开问题:package-lock.json 和可选包:https://github.com/npm/npm/issues/17722

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2018-09-23
    • 2018-03-21
    • 2022-12-07
    • 2018-12-14
    • 2019-03-15
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多