通过有似乎没有在办法安装到任意一个子文件夹node_modules
内置的事实沮丧,我想出了使用以下两种脚本偷偷摸摸的解决方案:
preinstall.js
var fs = require("fs");
try
{
fs.mkdirSync("./app/node_modules/");
}
catch(e)
{
}
try
{
if(process.platform.indexOf("win32") !== -1)
{
fs.symlinkSync("./app/node_modules/","./node_modules/","junction");
}
else
{
fs.symlinkSync("./app/node_modules/","./node_modules","dir");
}
}
catch(e){}
postinstall.js
var fs = require("fs");
try
{
if(process.platform.indexOf("win32") !== -1)
{
fs.unlinkSync("./node_modules/");
}
else
{
fs.unlinkSync("./node_modules");
}
}
catch(e){}
所有你需要做的就是将它们添加到scripts
选择使用他们在您的package.json
文件:
"scripts": {
"preinstall": "node preinstall.js",
"postinstall": "node postinstall.js"
},
所以,最大的问题是:它有什么作用?
那么,当你调用npm install
它创建你想要的子文件夹node_modules
的preinstall.js
脚本火灾。然后它会从node_modules
创建一个symlink
或(shortcut
在Windows中),npm
期望为node_modules
。
Then npm
安装所有依赖项。
最后,一旦安装了所有的依赖关系,脚本将启动postinstall.js
,从而删除symlink
!
这里有一个方便的gist与所有你需要的。
**你不能** 'npm'使用节点查找包的算法,这里详细说明: 你将不得不修改'节点'二进制文件为了支持“vendor/node_modules” –
2015-01-04 12:24:34
这是真的,但npm也不会安装到自定义目录。您可以提供一个路径,以便在节点遍历各个node_modules位置之前要求使用....但npm仍然不会安装任何位置,而是安装node_modules。所以你可以在技术上编写一个不使用npm的节点项目,但是你必须为每个需求硬编码每个路径。 – 2015-01-04 13:49:00