我有一个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.json
,Site1
,Site2
)仅引用该目录中安装的模块(不是所使用的共享模块)。
想象一下,网站1使用Site3
需要module1
,而共享版本为shared1@1
。
使用shared1@2
和npm@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)进行链接。或者我应该放弃,只是复制每个子目录中的模块?
答案 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
,但它们都很容易克服。希望这可以帮助同一条船上的其他人!