在父目录

时间:2017-05-10 22:39:47

标签: node.js npm

我有一个git repo,其中包含一些Node.js支持的网站;为了简化依赖关系管理,所有必需的生产npm模块都致力于repo。为了节省空间并避免重复,我想在父{4}目录中保存许多共享模块,每个站点(子目录)可以隐式或明确地使用它们。

示例:

node_modules

每个目录中的+ |- Site1 | |- node_modules (modules unique to Site1, e.g. module1...) | |- Site2 | |- node_modules (modules unique to Site2, e.g. module2...) | |- Site3 | |- node_modules (modules unique to Site3, e.g. module3...) | |- node_modules (shared/common modules) |- shared1@2 |- shared2@4 |- etc. 文件(package.jsonSite1Site2)仅引用该目录中安装的模块(不是所使用的共享模块)。

想象一下,网站1使用Site3需要module1,而共享版本为shared1@1

使用shared1@2npm@1,这可以正常工作,因为npm@2的依赖项安装在自己的module1子目录(node_modules)中。

使用Site1\node_modules\module1\node_modules\...和平面层次结构,我们开始遇到一些问题。 npm@3已安装到shared1@1,因此Site1\node_modules\shared1将使用该版本而不是“正确”版本。 Site1上的共享副本。

解决此问题的选项有哪些?我不确定node_modules\shared1是否可行,因为它通过本地全局目录(未提交给git)进行链接。或者我应该放弃,只是复制每个子目录中的模块?

2 个答案:

答案 0 :(得分:0)

我找到了解决方法。虽然它可能不是你正在寻找的,但显​​然有一个" - 遗产捆绑"运行npm install时可以使用的标志,它将使用嵌套的子依赖项安装依赖项。

所以如果你跑:

npm install --legacy-bundling

对于每个站点,它将按您的需要工作。这是我能想到的唯一方法,虽然我知道你的目标是去除你的依赖项,这可能会意外地导致更多的依赖项重复,而不仅仅是在每个站点的package.json中拥有所有依赖项。

答案 1 :(得分:0)

我发现了一种似乎可以做我想要的解决方法。基本上,对于安装在公共node_modules目录中的任何模块,它也在特定于站点的子目录package.json中列为dependency。但是,我实际上并没有将软件包安装到子目录中。

子目录清单中包的存在足以使npm避免在子目录node_modules的根目录中安装该包或该包的备用版本。< / p>

存在一些限制,例如工具(例如npm-check)缺少思维依赖性,并且无法在子目录中执行完整的npm i,但它们都很容易克服。希望这可以帮助同一条船上的其他人!