NPM:在不同版本中多次下载相同的库

时间:2018-03-20 19:36:16

标签: javascript angularjs npm jspm

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

但是现在让我们忘记NPM和node_module目录展平,并考虑如何有两个相同依赖的版本。

假设我们有两个名为XY的模块,两者都需要一个名为Z的模块,问题是X需要版本1,Y必需的版本2. NPM将创建一个像 - >

这样的结构
node_modules
  X  
    nodule_modules
      Z ver 1
  Y  
    nodule_modules
      Z ver 2

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

现在回到平坦位。

如果X& Y现在都使用Z ver 2.目录结构看起来像。

node_modules
  X
  Y
  Z ver 2

如你所见,X现在会找到Z ver 2,Y也是如此。 这是Node如何解析模块的简要说明。

希望有所帮助..

PS。就像@sripberger指出的那样,知道要保留和合并的内容取决于语义版本。

答案 2 :(得分:-1)

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