2013-04-23 48 views
4

好吧我有一點奇怪的情況。我有一個節點應用程序將被傳送到無法訪問互聯網的系統。我在我的package.json文件中有所有的代碼,但是當我提供服務器時,我無法運行npm install。在節點項目源代碼控制中存儲npm模塊的位置

目前node_modules目錄正被檢入到SVN中。到目前爲止,我討厭這個問題,因爲每當我需要獲取更新版本的模塊時,我都會從SVN中刪除整個模塊,安裝更新的版本,將其添加到SVN並簽入。

我有一些其他的選擇是有某種形式的構建,在打包節點應用程序以進行傳遞時執行npm安裝。也許從SVN中檢查出來,npm安裝並創建必要的tarball或rpm。

我在過去曾使用'bundler'作爲紅寶石,這很不錯,因爲您只需將所有代碼放在另一個目錄中,並且會拉入這些代碼。如果您處於離線狀態,則效果很好任何類似的節點?

+0

你在部署什麼?我通常使用系統的軟件包管理器對其進行打包(例如Debian的.deb,RedHat/Centos的.rpm等)。 – tjameson 2013-04-23 02:50:00

回答

3

在尋找類似的答案,我已經找到了這篇關於爲什麼有一些感覺,讓您充分node_modules在源代碼控制:

node_modules in git

雖然這是12月10日2011年,所以可能是現在有點過時了。

更新:在2014年1月,該建議存儲所有node_modules在源代碼控制仍然適用。

+1

因爲像phantomjs這樣的軟件包,我會建議不要檢查node_modules,例如爲當前系統安裝相應的二進制文件。這意味着如果一個開發人員在Linux上運行npm install並檢查node_modules - 它將不會適用於在Windows上克隆回購的另一Dev。最好檢查一下npm安裝下載的tarball,並指向npm-shrinkwrap.json。您可以使用npm install -g shrinkpack工具自動執行此過程。 – 2016-07-15 08:17:00

1

我也遇到過類似的部署情況,我搜索這個方法的依據是使用make(unix工具)並編寫我自己的Makefile。 Makefile是一個文本文件,它遵循特定的格式以及創建目標的位置,例如:test,publish,install .. 每個目標是從命令行調用時運行的一段Bash代碼,例如: '發佈'或者你可以將它們鏈接在一起,比如'make test publish'。因此,在我的場景中,我有一個執行測試的'測試'目標,然後我有一個'發佈'目標,執行幾個例如調用'npm install'然後'npm prune'(刪除舊npm我停止使用依賴項)。然後,「發佈」通過將文件夾的gzip壓縮到一個單獨的位置完成,然後將代碼推送到我的生產服務器可以從其下載並解壓縮的Intranet位置。所有node_modules代碼都在zip文件中。 在生產服務器上,操作團隊提取gzip,然後調用「make start」。 「開始」只是設置任何環境變量並啓動節點應用程序的另一個目標。

總結,我有我的node_modules在源代碼管理和我發現makefile是非常可定製的,因此它適合不同的項目有不同的需求,但你可以保持關於你的目標的命名約定,所以它很容易讓其他團隊工作人員和DevOps測試/發佈/安裝您的應用程序。

問候,路易斯。

2

有一個叫shrinkpack的CLI可以幫你管理這個。

它可以通過讀取npm shrinkwrap圖產生的依賴性和repointing的https://開頭的URL每個依賴性(和子依賴性),而不是指向一個壓縮包在你的項目中node_shrinkwrap目錄。

node_shrinkwrap目錄包含完全相同的.tgz的文件,從故宮註冊表npm install下載和 - 因爲一個npm-shrinkwrap.json文件存在(由npm shrinkwrap創建和更新shrinkpack) - npm install知道用tar包安裝找到本地,而不是通過網絡到npm註冊表。

npm install -g shrinkpack 
相關問題