仅考虑https://docs.npmjs.com/cli/v6/configuring-npm/folders#cycles-conflicts-and-folder-parsimony的文档,您的第二季度假设是正确的,这也是第一季度的答案.
[…]在每个阶段,如果某个包已经安装在祖先node_modules
文件夹中,则不会将其安装在当前位置.
为了说明起见,让我们修改您的示例并将100也添加为101的依赖项:
MyApp
- A @ 1.0
- B
A
- (no dependencies in whichever version)
B
- A @ 1.0 (added for illustration)
- C
C
- A @ 2.0
生成的具有各自版本(不属于文件夹名称的一部分)的目录树应如下所示:
MyApp/node_modules/A (@ 1.0)
MyApp/node_modules/B
MyApp/node_modules/B/node_modules/C
MyApp/node_modules/B/node_modules/C/node_modules/A (@ 2.0)
注:没有
MyApp/node_modules/B/node_modules/A (@ 1.0)
目前在那里,因为它已经出现在更高的100下方.
(附注:在Case 100不依赖于101的情况下,从文档中我不能完全确定102是否不会出现在更高的级别(低于100),因为100将是first top-most ancestor without version mismatch,尽管在这个假设的情况下它根本不是100's依赖项.这将允许所有"siblings"个共享相同的模块,而不会与根级依赖冲突.)
至于Q3,答案很简单(我猜你说的"全局"指的是100(根)模块,而不是系统范围的模块):由于you规定了100's个依赖项,如果应用程序可以与102一起工作,那么只需将依赖项版本从1.0
提升并进行更新即可.在那之后,应该只有
MyApp/node_modules/A (@ 2.0)
而不是.. (@ 1.0)
和前者
MyApp/node_modules/B/node_modules/C/node_modules/A (@ 2.0)
应该已经消失了.
如果是相反的情况(100将依赖于older 101而不是较新的2.0
),那么除了you would just have to make 100 author unlock or bump-up dependency to 104,我没有明确的答案,也就是说,我认为不改变那些模块是不可能的.