我正在使用coffeescript开发Play Framework 2.4和AngularJs 1.5.8。 我正在分析使用npm是否方便。 我们正在使用几个库,其中许多都有自己的依赖项。 所以,我不知道,如果2个不同的库具有相同的依赖但在不同的版本中会发生什么? 它可能是一个问题吗?哪个版本将在node_modules目录中下载? 是否可以使用npm使用同一个库的2个版本,还是需要像jspm这样的东西? 提前谢谢。
答案 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目录展平,并考虑如何有两个相同依赖的版本。
假设我们有两个名为X
和Y
的模块,两者都需要一个名为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个不同版本。