Node.js npm 3平面依赖关系并非始终适用

Node.js npm 3平面依赖关系并非始终适用,node.js,npm,Node.js,Npm,我有3个依赖项,它们都引用了esprima fb,版本解析为15001.1001.0-dev-harmony-fb 我本来希望在node_modules文件夹的顶层看到esprima fb,但它不在那里。它们位于每个依赖项的node_modules文件夹中 一切仍然正常,但这意味着我无法成功确保我的npm-shrinkwrap.json文件是最新的,因为我使用的工具期望在npm-shrinkwrap.json依赖项的顶层找到esprima fb,而不是嵌套在每个依赖项中 我的问题是,哪一位的行为

我有3个依赖项,它们都引用了esprima fb,版本解析为15001.1001.0-dev-harmony-fb

我本来希望在node_modules文件夹的顶层看到esprima fb,但它不在那里。它们位于每个依赖项的node_modules文件夹中

一切仍然正常,但这意味着我无法成功确保我的npm-shrinkwrap.json文件是最新的,因为我使用的工具期望在npm-shrinkwrap.json依赖项的顶层找到esprima fb,而不是嵌套在每个依赖项中


我的问题是,哪一位的行为出乎意料?不将至少一个版本的esprima fb安装到顶层,从而实现npm?通过假设npm总是以这种方式运行的比较工具?

虽然效率很低,但
npm
并没有使依赖关系平坦化(因为它的所有三个副本都在同一版本中,这很奇怪),这种行为是完全有效的。另一个工具不应该期望依赖项安装在顶层


另一种看待它的方式:如果这3个esprima fb依赖项解析为稍微不同的版本怎么办?在这种情况下,不展平这些依赖项是唯一的选择。

虽然效率很低,但
npm
不会展平依赖项(因为它的所有三个副本都在同一版本中,这很奇怪),这种行为是完全有效的。另一个工具不应该期望依赖项安装在顶层


另一种看待它的方式:如果这3个esprima fb依赖项解析为稍微不同的版本怎么办?在这种情况下,不展平这些依赖关系是唯一的选择。

我遇到了嵌套在
jstransform
下的
esprima fb
的相同行为。我不知道为什么要嵌套
esprima fb
,但我还发现
node pre gyp
嵌套在
fsevents
下,我认为这是因为
node pre gyp
是一个捆绑依赖项(请参见
jstranform
package.json
)。绑定的依赖项随模块一起发布。如果您查看npm缓存中的gzip,您会发现捆绑的依赖项压缩在其父级中,在
节点\u模块中。我称他们为模块偷渡者。

我遇到了嵌套在
jstransform
下的
esprima fb
的同样行为。我不知道为什么要嵌套
esprima fb
,但我还发现
node pre gyp
嵌套在
fsevents
下,我认为这是因为
node pre gyp
是一个捆绑依赖项(请参见
jstranform
package.json
)。绑定的依赖项随模块一起发布。如果您查看npm缓存中的gzip,您会发现捆绑的依赖项压缩在其父级中,在
节点\u模块中。我称他们为模块偷渡者。

我的理解是,至少有一个(npm在安装过程中遇到的第一个)将被提升到顶层。这在这里并没有发生,所以我想知道到底发生了什么。我猜是有一些设置(npm包有很多设置)阻止了npm这样做,或者混淆了npm的意外行为。如果你能花一些时间在这个问题上,那么就可以找到一个最小的例子,那就是“失败”,并考虑提交一个bug。也就是说,我仍然相信你不应该指望一个(哪一个?只是一个随机的?)包实例会出现在顶层。我的理解是,至少有一个(安装过程中遇到的第一个npm)会被提升到顶层。这在这里并没有发生,所以我想知道到底发生了什么。我猜是有一些设置(npm包有很多设置)阻止了npm这样做,或者混淆了npm的意外行为。如果你能花一些时间在这个问题上,那么就可以找到一个最小的例子,那就是“失败”,并考虑提交一个bug。尽管如此,我仍然相信您不应该指望包的一个(哪一个?只是一个随机的?)实例会出现在顶层。