2

设置:

鉴于以下几点

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

问题:

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

最终解决方案:

为避免jquery依赖重复(outer_library 为 1.7.3,my_library3.3.1 )我可以将我的jquery ^3.3.1从to移动,因此我将在开发中获得3.3.1而不会在生产中安装( ) 并且只安装jquery 1.7.3dependenciesdevDependenciesnpm install --only=prod

但是这个:

  • 不保证my_library将获得兼容的jquery版本,因此my_library很容易中断。
    • jquery@>=2.2.0my_library 中添加peerDependencies至少会引发一个警告,要求在custom_project中手动安装特定版本来解决冲突(即使它可能无法解决)。
  • 对我来说感觉不对,因为jquery是一个运行时dependency并且不应该进入devDependencies(使用单元测试工具等)。实际上jquery不会安装在custom_project_2中,在生产上安装时(所以my_library会中断)

问题

  1. 我怎样才能满足my_library依赖的两个用例?

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

  3. (B) 是否存在peerDependencies不抱怨且不需要手动安装任何东西的情况?(只要semvers受到尊重?)

  4. (A) 将jquery之类的依赖项(冲突的高概率)放在内部(尽可能松散的semver推荐版本的内部是否有意义?peerDependenciesdependencies

  5. (B) 在每个设置NPM版本<3(peerDependencies 自动安装)和>=3(需要手动安装)中都能正常工作吗?

如果您能回答部分问题,我们将不胜感激

4

1 回答 1

0

假设 my_library 对 jquery 的依赖是对等依赖是否安全?并且您在 my_library 的开发团队中?

如果是这样,最好的解决方案可能是将 my_library 对 jquery 的对等依赖项更改为常规依赖项。如果我正确理解这篇文章,只有对等依赖项才能在包之间产生冲突,常规包被安装到子目录中,所以 my_library 得到它自己安装的 jquery 版本,与 outer_library 分开。

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

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

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

于 2019-07-02T11:47:43.140 回答