繁体   English   中英

npm:引用一个peer依赖; 如何从对等依赖项中对齐版本

[英]npm: refer to a peer dependency; how to align the version from a peer dependency

抽象地说,我对提供的dependency-B版本没问题,由于dependency-A已经安装了它。

  "dependencies": {
    "dependency-A": "x.y.z",
   }
$> npm ls --depth=1
├─┬ dependency-A@x.y.z
│ ├── dependency-B@x.y.z

所以当我require('dependency-B')时,我会期望A 的依赖。
我正在使用该库中的根 function,事实上,如果dependency-A会影响版本,我想与它对齐并使用它使用的相同版本。

如果dependency-B -B,则将安装全新的 package。

  "dependencies": {
    "dependency-A": "x.y.z",
    "dependency-B": "a.b.c",
   }
$> npm ls --depth=1
├─┬ dependency-A@x.y.z
│ ├── dependency-B@x.y.z
│ ├── ...
├─┬ dependency-B@a.b.c

我很想不在我的依赖项中列出dependency-B 我应该避免这种做法吗? 依赖我的主要依赖安装的对等版本不行吗?


如果这是一个错误的做法,我怎么能告诉 npm 给我它由另一个 package 安装的完全相同的版本?

  "dependencies": {
    "dependency-A": "x.y.z",
    "dependency-B": "~try the one that is installing dependency-A~",
   }

tl;dr :您应该始终拥有您在自己的dependencies项 object 中使用的所有依赖项,因为 package 管理器的一致实现不需要让您访问依赖项的依赖项。

这是一个有趣的问题,我可以想到您可能会遇到的两种情况:

  1. 出于您自己的一系列原因,您的 package 和dependency-A都独立使用dependency-B ,而您根本不在乎使用哪个版本。
  2. 您需要使用dependency-B来与dependency-A交互,方法是创建 B 的对象或接收 A 创建的 B 的对象。

场景一:独立使用

If you and your dependency need the same package but don't need to share anything about it, Node gives you the amazing ability of using different versions of the same package in different places by specifying different versions in the package.json of your package and你图书馆的。 这是 Node 模块系统的优势之一。

但是,您的情况是您不关心 package 的实际版本(这让我认为这不是您的情况)。 特别是,您想知道是否最好不要在自己的package.version中定义任何内容,而让 Node 找到您的依赖项的依赖项。

最后一种情况是唯一可能的,因为您使用的是npm ,并且npm做了一件特别的事情:它扁平化模块树以消除重复数据包,也就是说,同一版本可以满足的多个依赖项规范是,最后,使用完全相同的版本。 这会减少模块树的大小和深度,但会产生意想不到的后果,即您现在可以访问尚未指定为依赖项的包,只是因为它们已安装在您的node_modules目录中以进行重复数据删除。

这不是唯一可能的策略,并且pnpm ,另一个 package 管理器,而是使用符号链接来实现相同的目标。 我不会详细介绍,但pnpm将所有依赖项安装在不同的系统范围(或用户特定)目录中,然后从您的node_modules (以及依赖项自己的node_modules )符号链接到其中的适当位置文件夹。 这不仅实现了项目重复数据删除,而且实现了系统范围的重复数据删除,因为使用特定 package 版本的所有项目都将使用相同的安装 然而,这个系统的后果是你“失去”了在你自己的 package 中使用依赖项的依赖项的能力,因为它们实际上不再位于node_modules

除此之外,您不关心他们使用的版本的想法。 几乎从来没有这种情况,因为语义版本控制的重点是避免或包含由于依赖版本升级而导致的损坏。 您不关心您现在使用的版本,但是如果 package 在您的依赖项中升级到不同的主要版本,您的 package 可能会意外中断。

总之,不定义您将要使用的依赖项是一种不好的做法,因为它会阻止其他开发人员在不同的 package 管理器中使用您的 package,并且因为它会使您面临无法预料的破坏要妥善管理。

场景 2:依赖使用

鉴于您对问题的描述,更有可能的情况是,在您使用dependency-A的某个时刻,它要么要求某些东西,要么从dependency-B返回某些东西。 在这种情况下,希望两者都使用相同的或至少兼容的版本,以便所有关于正在交换的对象形状的假设都成立。

指定这种情况的正确方法是将dependency-B显式声明为dependency-A的对等依赖项。 如果不是这种情况,那么它们就是不正确的,如果可能的话,您绝对应该在问题中提出这一点。 作为一种解决方法,您可以只声明与他们相同的版本,并注意他们的版本升级可能导致的损坏。 在您自己的package.json中未定义任何内容可能会遇到与场景 1 中相同的问题。

但是,另一种可能性是您甚至require该依赖项 可能是他们希望您传递数据、函数、对象或任何将进一步传递给dependency-b东西,但以某种方式使您不必直接与dependency-B交互。 在这种情况下,他们实质上是将 B 的 API 的一部分合并到自己的中,因此dependency-B任何重大更改也应该导致dependency-A的重大更改。 这可以保护您免受意外损坏,避免您必须在package.json中定义任何内容,这意味着您是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM