2015-01-04 52 views
8

如何在本地爲每個項目安裝npm模塊到vendor/node_modules並使package.json文件能夠看到它們。將node_modules安裝到供應商

我不想動的package.json給供應商的文件夾

我有涼亭和.bowerrc我指定的bower_components路徑 - 這是超級容易。

我該怎麼用npm做到這一點?

我已經閱讀了docs,npmrc docs,這裏有一些問題,用google搜索了一個多小時 - 還是沒有運氣。這對於這樣一個簡單的任務來說是非常困難的。

我不在乎缺點,只是告訴我怎麼做最後。

回答

2

您不能使用內置的npm功能。

This discussion關於npm的github存儲庫涵蓋了這個問題。這也是this answer,這是他們的FAQ的一部分。

你仍然可以做安裝「人工」複製模塊到您的/vendor目錄,然後使用require("./vendor/whatever")語法調用它們...但是,這意味着每個require需要使用新的自定義位置。有幾種方法可以處理這個問題,但它們都意味着你在源代碼中做了額外的工作以適應自定義位置。

+0

**你不能** 'npm'使用節點查找包的算法,這裏詳細說明: 你將不得不修改'節點'二進制文件爲了支持「vendor/node_modules」 – 2015-01-04 12:24:34

+0

這是真的,但npm也不會安裝到自定義目錄。您可以提供一個路徑,以便在節點遍歷各個node_modules位置之前要求使用....但npm仍然不會安裝任何位置,而是安裝node_modules。所以你可以在技術上編寫一個不使用npm的節點項目,但是你必須爲每個需求硬編碼每個路徑。 – 2015-01-04 13:49:00

9

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

所以,最大的問題是:它有什麼作用?

  1. 那麼,當你調用npm install它創建你想要的子文件夾node_modulespreinstall.js腳本火災。然後它會從node_modules創建一個symlink或(shortcut在Windows中),npm期望爲node_modules

  2. Then npm安裝所有依賴項。

  3. 最後,一旦安裝了所有的依賴關係,腳本將啓動postinstall.js,從而刪除symlink

這裏有一個方便的gist與所有你需要的。

+1

你剛剛用符號鏈接的想法保存了我的一天,這對我的用例非常有用(在許多項目中使用相同的模塊,因此很難鏈接整個node_modules目錄,就像一個魅力一樣)。 – 2016-02-19 22:41:08

+0

絕對精彩! – 2016-10-29 15:44:18

+0

這適用於node_modules,但現在我的gulpfile.js抱怨沒有安裝本地gulp,除非我通過不運行postinstall.js來保留符號鏈接 有沒有辦法讓gulpfile.js在這種情況下執行? – 2016-10-29 17:23:40

相關問題