通過有似乎沒有在辦法安裝到任意一個子文件夾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