![](/img/trans.png)
[英]Git. “npm link” files are not ignored in the (node_modules is in gitignre)
[英]getting npm modules in node_modules under git control
我有很多git存儲庫,每個存儲庫都有各自的npm package.json文件,它們相互引用。 當我使用npm install安裝主軟件包時,它將成功將所有package.json中引用的所有git repos克隆到node_modules文件夾中。 但是,對於我來說,它們沒有與.git文件夾一起克隆,以使所有更改都受源代碼控制。 是否可以npm安裝這些軟件包並獲取.git文件夾?
謝謝
它們並不適合所有人,但我真的很喜歡使用git子模塊進行此類操作,因此我想找到一種方法來使用它們:
在local_modules/
下添加子模塊:
git submodule add -b develop git@github.com:JarvusInnovations/git-client.git local_modules/git-client
使用file:
前綴在package.json
聲明依賴項:
{ "dependencies": { "git-client": "file:local_modules/git-client" } }
刷新node_modules/
:
npm install
現在,NPM在node_modules/
下創建到../local_modules/git-client
的符號鏈接,您可以將希望子模塊放在主項目中的任何HEAD提交。 因此您的開發工作流程看起來像
現在,當其他開發人員克隆( --recursive
)或拉(然后運行git submodule update --init
)進行預發布工作時,可以保證他們具有正確的預發布模塊代碼
通常, node_modules
內部的文件應該由npm
管理。 Node最初並不是以這種方式設計的,但是npm已經發展成為node.js的標准軟件包管理工具(甚至與node一起提供!)。
如果您有自己想要維護的模塊,則有幾種處理方法。
(有時也稱為“庫”)
編寫自己的模塊的最簡單方法是要求使用相對或絕對路徑:
var my_module = require('./my_module'); // notice '.js' is not needed
大多數人將所有軟件包特定的模塊放在一個名為lib
或src
的目錄中。 因此,您可以要求它們為:
var my_module = require('./lib/my_module');
請注意,該路徑是相對於您正在編輯的文件的。 因此,如果一個lib文件需要另一個lib文件,則不需要'/lib'
。
有些人在require()
不喜歡'./lib/..'
的外觀。 但是他們仍然希望其特定於軟件包的模塊在軟件包回購的控制之下。 在這種情況下,一種解決方案是將模塊符號鏈接到node_modules
。
在我的一個項目中,我在package.json中有以下內容:
"postinstall": "bash -c 'cd node_modules;ln -sf ../lib/*.js .'"
它的作用是創建所有的符號鏈接.js
中的文件./lib
當您運行到node_modules文件夾npm install
。
如果您的多個項目共享多個模塊,則可以(ab)使用node.js搜索模塊的方式。 Node.js將在當前目錄中搜索文件夾node_modules
在其中搜索模塊,如果找不到它,它將遞歸node_module
文件夾等的父目錄,一直到根目錄。
因此,擁有自己的自我管理模塊的一種方法是將node_modules
文件夾放在父目錄中:
/home/myself/
code/
node_modules/
my_module1.js
my_module2/
node_modules
.git
index.js
package.json
project1/
node_modules/
.git
main.js
package.json
project2/
node_modules/
.git
main.js
package.json
這樣, project1
和project2
都可以訪問my_module1
和my_module2
。 另外, my_module2
可以有自己的git repo。
參加聚會的時間很晚,但是在閱讀了幾篇文章(包括一篇以及幾個小時的抨擊/測試后)后,我感到不得不與我分享我在版本控制下用作節點項目中的軟件包的本地倉庫的看法。
從項目的根目錄開始:
npm link /path/to/your/local/package/
npm link <"name:">
“ name:”在本地包的package.json中的鍵
npm install --save /path/to/your/local/package/
您不會在npm文檔中找到有關使用“鏈接”的最后一個,但這很關鍵
注意 :您可以使用相對路徑(例如,如果共享父文件夾, ../<localpackagefoldername>
)
重要 :您的本地軟件包package.json必須有一個軟件包“名稱:”鍵和一個“ main:”鍵指向一個入口點js文件,否則所有操作都會失敗。
現在,您可以在代碼中使用require('name')
,以后再發布到npm時,您無需進行任何更改,可以在project package.json中找到該行,就像刪除一樣容易刪除和npm install
。
如果使用npm install
將軟件包添加到本地模塊,則在項目中執行相同的操作,它將被添加到項目的node_modules中。 如果您在本地軟件包中進行npm uninstall
,則在項目中進行npm prune
注意 :如果已在本地軟件包根目錄中運行npm install
在該軟件包的根目錄中創建了node_modules,現在當您在項目中進行npm install
,您將收到類似這樣的警告,您可以忽略skippingAction Module is inside a symlinked module: not running remove
。 如果那有問題,那么您可以在不單獨運行本地軟件包的情況下刪除node_modules文件夾。
從npm 3開始,現在已對node_modules進行了展平,因此以這種方式進行操作意味着您在項目中對本地包的依賴也已展平! 此外,您不能僅將完整的git repo放入node_modules中,因為npm會鄙視.git文件夾,當然您將嵌套node_modules。
我的大把戲 :確保您可以在與項目不同的目錄中擁有本地軟件包存儲庫,但如果將其作為項目子目錄中的git子模塊,則可以兼得兩全,node_modules中的扁平化依賴項以及項目和包(子模塊)同時進行。 另外,它使那些鏈接命令路徑變得微不足道。
提示 :如果您轉到單獨的目錄(無子模塊)路徑,請使用ide編輯器(例如atom)將本地包文件夾添加到項目樹中,以便於您的項目輕松編輯。 同樣,如果您走這條路線,則由您來提交和推送對本地包的更改,因為它不是子模塊。
我可能目前唯一需要注意的警告是,即使本地軟件包中有依賴項,也要確保它們在項目的package.json中,否則如果有人在其他地方(自己使用)使用本地軟件包,它將缺少npm install
依賴項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.