Node.js 如何将树中的所有npm依赖项解析为单个版本

Node.js 如何将树中的所有npm依赖项解析为单个版本,node.js,gruntjs,npm,dependency-management,Node.js,Gruntjs,Npm,Dependency Management,我对npm有些陌生,我一直致力于将现有的构建过程转换为在npm包管理中使用grunt。我们有许多内部组件,可以用来构建我们的应用程序。这会导致依赖关系树变得相当复杂。作为一个简化示例,请考虑: module-bcm@1.1.0 ├─┬ module-help@1.0.8 │ └── module-translation@1.2.1 └─┬ module-validation@1.0.6 └── module-translation@1.2.2 在maven世界中,模块翻译包将被解析为单个版

我对npm有些陌生,我一直致力于将现有的构建过程转换为在npm包管理中使用grunt。我们有许多内部组件,可以用来构建我们的应用程序。这会导致依赖关系树变得相当复杂。作为一个简化示例,请考虑:

module-bcm@1.1.0
├─┬ module-help@1.0.8
│ └── module-translation@1.2.1
└─┬ module-validation@1.0.6
  └── module-translation@1.2.2
在maven世界中,模块翻译包将被解析为单个版本,然后构建系统知道要将哪个包包含到应用程序中

在npm中,我发现完整的树是按照所描述的方法在node_modules目录中创建的

  • 有没有工具可以解析为单个版本?
  • 我更喜欢这种方法,因此我可以使用glob模式将所有已解析的依赖项都包含到应用程序中
  • 在npm中将系统解析为单个版本是个坏主意吗?
  • 当然,这可能会导致依赖项之间的版本不兼容,但无论是系统地还是手动地将依赖项解析为单个版本,这种情况都存在。还有其他潜在问题吗

  • 这里有一个相关的问题,但没有答案:。

    我发现这个问题在npm依赖关系管理的世界里没有太多意义。与maven等工具不同,js可以同时使用同一包/工件的多个版本


    我的理解是,使用browserify(或requirejs)等工具,它可以处理上述需要不同版本“模块翻译”的情况。所以,真的没有必要把树压扁。由于扁平化树可能会产生版本冲突,如果browserify可以处理多个版本,为什么要这样做呢?

    在某种程度上相关的注释中,
    Warn
    (它在引擎盖下使用
    npm
    )提供了一个选项,可以安装所有依赖项,每个包只有一个版本(),有效地生成平面依赖树


    如果需要更精确的控制,请查看。

    您可以使用它来减少重复。但是,它是否可以减少到单个版本取决于每个依赖模块指定的版本范围。它们可能不都与同一个版本对齐,
    npm
    不会降低到可能引入破坏的程度。我尝试过这一点,是的,它可以缩短树,但前提是所有版本都相同。我想问题真的是关于将多个版本解析为一个版本,这将不可避免地有可能引入突破性的更改。你说npm不会这么做,有没有什么工具可以这么做?一个web应用程序,它希望通过允许开发人员强制项目使用单个版本来避免多个版本,从而尽可能提高带宽效率。当然,这很可能会导致冲突,但它仍然应该是开发人员可用的选项。如果我们有这种情况,那么使用同一软件包的不同版本可能会很烦人:-模块中的类-translation@1.2.1在模块的接口中使用-help@1.0.8. - 模块中的类-translation@1.2.2在模块的接口中使用-validation@1.0.6. - 模块中的接口-help@1.0.8和模块-validation@1.0.6在模块中进行交互-bcm@1.1.0. 不同版本的模块转换会导致不兼容的API,除非在这种情况下这些包中严格遵循语义版本。