2015-04-22 112 views
36

每當我做項目時,我都必須下載節點模塊的所有依賴關係。在不復制node_modules的情況下,是否有共享多個項目中的中央node_modules?如何讓多個項目共享node_modules目錄?

像以下,我不得不每一次運行多個命令..

npm install gulp-usemin                   
npm install gulp-wrap 
npm install gulp-connect 
npm install gulp-watch 
npm install gulp-minify-css 
npm install gulp-uglify 
npm install gulp-concat 
npm install gulp-less 
npm install gulp-rename 
npm install gulp-minify-html 
+1

你可以安裝它們在一個共同的父目錄中,如果有的話。 Node會[遍歷目錄](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)搜索'require'd模塊。否則,不,沒有官方的「central」node_modules文件夾用於require()。 –

+0

您可以使用全局標誌全局安裝這些軟件包。所以你不需要每次都運行安裝命令。 'npm install -g' –

回答

40

你絕對可以共享node_modules目錄之中的項目。

node's documentation

如果傳遞給需要()的模塊標識符不是天然模塊, 並且不以 '/', '../' 或」開始./ ',則節點從當前模塊的父目錄 開始,並添加/ node_modules,並且 嘗試從該位置加載模塊。

如果在那裏沒有找到它,那麼它將轉到父目錄,並且如此類推,直到達到文件系統的根目錄爲止。

例如,如果在「/home/ry/projects/foo.js」的文件名爲 要求(「bar.js」),則節點會看在以下位置,在 順序如下:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

所以只是把node_modules你的項目目錄中的文件夾,並放入你想要的任何模塊。只需要像平常一樣。當節點在項目文件夾中找不到node_modules目錄時,它會自動檢查父文件夾。所以,讓你的目錄結構是這樣的:

-myProjects --node_modules --myproject1 ---sub-project --myproject2

所以像這樣,即使您的子項目的依賴關係可以在你的主node_modules庫繪製。

這樣做的一個缺點是你將不得不手動構建你的package.json文件(除非有人知道用grunt或其他方法自動化這個)。當您安裝軟件包並將--save arg添加到npm install命令中時,它會自動將其附加到依賴項部分或package.json中,這很方便。

+1

爲什麼這不被接受爲答案op?對@tpie的進一步問題,應該像你所建議的那樣構建一個項目,如何構建package.json以便從父模塊存儲庫進行安裝。 – diehell

+0

@diehell因此,它似乎是「全部或全部」。如果所有或依賴關係都存在於父目錄中,並且CWD中沒有node_modules目錄,則npm將檢查父目錄並在其中找到它。如果你將一個node_modules文件夾放在它將要安裝的目錄中。 – tpie

4

我找到了一招,只要看看Symbolic Links (symlinks) on Windows or Linux,它就像快捷鍵一樣工作,但功能更強大。

只需在需要的任何地方爲您的node_modules文件夾製作一個Junction即可。

要實現這一目標,至少需要一個node_modules真實文件夾,然後在其他項目中爲其建立連接。

在Windows上,您可以使用命令提示符或使用應用程序。使用命令提示可以給你更多的控制權,使用應用程序更容易,我建議Link Shell Extension

+1

我cd到目標目錄,運行這個命令:'mklink/d node_modules(源目錄)\ node_modules'。 – ChrisTorng

+1

我的團隊現在一直在使用這種方法。雖然我真的很鄙視在項目文件夾本身沒有'node_modules',這是有效的。在安裝新的東西之前,請記得瀏覽到實際的'node_modules'文件夾:P –

0

我們假設有一個node_modules它應該包含所有應用程序的所有包。因此,您的應用程序也將分享最獨特的package.json項(只是名稱應該改變)

我的想法是有一個根和多個SRC級別,如下

root\package.json 
root\node_modules 
root\\.. 
root\app1\src\\.. 
root\app2\src\\.. 

唯一的問題你可能會面臨將有JSON(或tsconfig)的任何應用程序備份,當你在上面或設置工作啓動腳本,以服務於任何應用

1

主目錄應該是這樣的

node_modules 
Project 1 
Project 2 
Project 3 
Project 4 
0123恢復它們

只需打開該文件Project 1/.angular-cli.json

更改架構

"$schema": "./node_modules/@angular/cli/lib/config/schema.json", 

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json" 

,不要忘記創建項目目錄內node_modules空文件夾