如何使用peerDependencies解决NPM中的依赖地狱

时间:2018-07-17 18:33:05

标签: jquery npm dependencies package-control peer-dependencies

设置:

给出以下几点

  • my_library 广泛使用 jquery 的运行时。
  • my_library 中,通过 npm 要求的 jquery 中的
  • 默认情况下为^3.3.1(由于其中存在安全修复程序)。但是,它也与 jquery> = 2.2.0 兼容(但尚未在package.json中指定)
  • 通过 npm custom_project 中使用
  • my_library 。
  • custom_project 还需要 outer_library ,即使用不同且相互冲突的 jquery 版本(例如,假设 jquery 1.7.3 < / strong>)。
  • custom_project_2 只是在dependencies中需要 my_library

问题:

  • 安装 custom_project 将引起重复的依赖关系,使两个库之一的 jquery 混乱。
  • my_library dependencies中的 jquery 版本指定了建议的版本(以避免严重漏洞),但没有说明哪个 jQuery 的最低版本与 my_library
  • 兼容

最终解决方案:

为避免 jquery 依赖项重复( outer_library 为1.7.3, my_library 为3.3.1),我可以移动 jquery ^ 3.3.1 dependenciesdevDependencies,因此我将获得 3.3.1 进行开发,而不会在生产环境中安装({ {1}}),仅安装 jquery 1.7.3

但这是

  • 不保证 my_library 将获得兼容的 jquery 版本,因此 my_library 可能很容易损坏。
    • my_library npm install --only=prod内添加jquery@>=2.2.0至少会引发 WARN 要求解决冲突,以便在中手动安装特定版本custom_project (即使可能无法解决)。
  • 觉得我错了,因为 jquery 是运行时peerDependencies,不应进入dependency(使用单元测试工具等)。实际上,在 production 上安装时, jquery 不会安装在 custom_project_2 中(因此 my_library 会中断)

问题

  1. 我如何设法满足 my_library 的两种依赖用例?

  2. (A)如果 outer_library 需要与我的devDependencies定义(peerDependencies)兼容的 jquery ,我是否可以还需要手动安装 jquery 吗?还是 npm 将解析一个通用版本?

  3. (B)在某些情况下,>=2.0.0不会抱怨并且不需要手动安装任何东西吗? (只要纪念会员?)

  4. (A)是否在peerDependencies内放置诸如 jquery (冲突的高概率)任一之类的依赖项(带有as

  5. 并在peerDependencies内的中尽可能松散 emem )。
  6. (B)在具有 NPM 版本dependencies(自动安装了peerDependencies)和<3的每个设置中,该方法都能正常工作(需要手动安装)?

对于您甚至可以回答部分问题表示赞赏

1 个答案:

答案 0 :(得分:0)

可以安全地假设my_library对jquery的依赖是对等依赖吗?您是my_library开发团队的成员吗?

如果是这样,最好的解决方案可能是将my_library对jquery的对等依赖关系更改为常规依赖关系。如果我正确理解this article,则只有同级依赖项会在程序包之间产生冲突,将常规程序包安装到子目录中,因此my_library是安装的自己的jquery版本,与external_library分开。

但是,将对等依赖项转换为常规依赖项可能是不可能的。 https://medium.com/@jacob.h.page/common-npm-mistakes-51bf8989079f

  

您的模块是某个库或框架的插件吗?那么那个库/框架是对等的依赖。消费应用程序负责选择和集成一组相互兼容的插件。插件本身不应该直接引入上述框架,而应该指定一个最大包含范围的版本范围,以使集成工作尽可能容易。

您的另一个选择是等待outer_library发布与最新的jQuery兼容的新版本。