【问题标题】:NPM: download the same library many times in different versionsNPM:在不同版本中多次下载同一个库
【发布时间】:2018-03-21 04:05:24
【问题描述】:

我正在使用 coffeescript 开发 Play Framework 2.4 和 AngularJs 1.5.8。 我正在分析使用npm是否方便。 我们正在使用几个库,其中许多都有自己的依赖项。 所以,我不知道,如果 2 个不同的库具有相同的依赖项但版本不同,会发生什么? 它会产生问题吗? node_modules 目录下会下载哪个版本? 是否可以仅使用 npm 使用同一个库的 2 个版本,还是我需要类似 jspm 的东西? 提前致谢。

【问题讨论】:

  • NPM 是为多种不同的依赖而设计的,......它只是不会把它们弄平。

标签: javascript angularjs npm jspm


【解决方案1】:

NPM 从一开始就一直被设计为处理多个版本的依赖项。它通过使所有 NPM 模块都有自己的 node_modules 目录来做到这一点。这确实导致了模块膨胀,所以后来 NPM 被用来智能地扁平化 node_modules 目录。

但是现在让我们忘记 NPM 和 node_module 目录扁平化,想想如何可能拥有相同依赖项的 2 个版本。

假设我们有两个名为 XY 的模块,都需要一个名为 Z 的模块,问题是 X 需要版本 1,Y 需要版本 2。NPM 会创建一个类似的结构->

节点模块 X 结节模块 Z 版本 1 是 结节模块 Z 版本 2

由于 node 搜索 node_modules 目录的方式,X 总是会找到 Z 的正确版本。Y 也是如此。这是因为 node 将首先检查当前目录是否存在 node_modules,如果不存在则向上遍历目录树,直到找到一个名为 Z 的模块。

现在回到扁平化位。

如果 X 和 Y 现在都使用 Z 版本 2。目录结构将类似于。

节点模块 X 是 Z 版本 2

如您所见,X 现在将找到 Z 版本 2,Y 也将如此。 这是Node如何进行模块解析的简要说明。

希望对您有所帮助..

ps。就像@sripberger 指出的那样,知道要保留和合并什么是由语义版本决定的。

【讨论】:

  • 感谢您的解释!这对我很有帮助。你知道是否有可能向节点表明我想成为谁来决定在这种情况下我想要保留的依赖关系的哪个版本?在您的示例中,我想决定要保存的 Z 的哪个版本,并且该节点只通知我发生了错误。
  • 如果这就是你的意思,可以忽略 semver,基本上不允许 NPM 决定,.. 只需复制你想要的 node_modules 和版本.. 我这样做的方式是创建一个临时目录,npm 将我想要的版本安装到这个目录中,然后只需将模块复制到您当前的 node_modules 目录中。基本上忽略任何 semver,你基本上永远不会在你安装这些的目录中使用 NPM。IOW:你手动控制的依赖项。
  • 是的!这就是我想要的。所以,我将在我的项目中使用 npm。谢谢!
【解决方案2】:

npm 使用semantic versioning 指定版本范围。默认情况下,当您运行 npm install --save foo 时,它会下载最新版本的 foo 包并将其编号存储在 package.json 依赖项中,以插入符号 (^) 开头。插入符号表示“兼容”,这通常表示具有相同主要版本(第一个数字)的任何内容。

当 npm 解析嵌套依赖时,它会检查依赖的版本字符串是否可以用单个版本来解析。如果是这样,它会将该版本安装在顶级 node_modules 目录中。否则,它会在嵌套的 node_modules 目录中为每个安装一个版本。

换句话说,它会自动处理此问题,前提是发布者遵循语义版本控制约定,并且不包括在次要版本或错误修复版本中的重大更改。这是由社区强制执行的,因为不遵守上述约定是让人们不想使用你的东西的好方法。

【讨论】:

    【解决方案3】:

    根据我的经验,NPM 通常会用旧版本替换软件包的最新版本。所以我认为如果你使用 NPM,那么不可能存储同一个包的 2 个不同版本。

    【讨论】:

    • NPM 只有在满足 semver 的情况下才会替换 depancy。并且完全有可能运行 2 个版本的 NPM 模块。 IOW:大多数 semver 只能在同一主要版本内升级。
    • 谢谢基思!那么,node_modules 目录呢?当我打开它时,是否会有 2 个同名文件夹或 npm 重命名它们?谢谢!
    • @JohanaAnez 我会发布一个简短的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2011-08-13
    相关资源
    最近更新 更多