2013-01-17 148 views
10

Heroku很棒。但每次部署時,Heroku似乎都想重新下載並重新構建所有軟件包。用socket.iomailparser這需要大約3分鐘。加速部署Heroku

有沒有辦法加快部署過程?有沒有辦法告訴Heroku它可以緩存這些項目?或者我可以上傳預構建的node_modules

+0

[build-pack](https:// github。com/heroku/heroku-buildpack-nodejs)(這是將你的源代碼轉換爲在Heroku上部署的代碼)應該已經在構建之間緩存'node_modules'。至少它在自述文件中這樣說。你確定這是什麼放緩你的構建? – friism

+2

@friism我猜他們使用標準的NPM緩存,所以模塊仍然需要解壓縮,複製,最重要的是,每次推後重新編譯。如果您的模塊具有混雜的依賴關係樹或取決於C++擴展(mongodb,socket.io等),則需要一些時間。 –

回答

8

似乎就像今天Heroku終於緩存了node_modules文件夾!

----->刪除6個匹配.slugignore模式的文件。

-----> Node.js的應用程序檢測

----->請求的節點範圍:0.10.x

----->解決節點版本:0.10.22

----->下載和安裝節點

----->從緩存恢復node_modules

----->安裝dependen CIES

----->修剪未使用的依賴

----->緩存node_modules用於將來目錄建立

----->清理節點-GYP和NPM工件

構建時間就像我現在3秒鐘。

+0

是的,我今天也有同樣的經歷。它會一直緩存它們還是會知道它們何時自動更新? – Alexis

+1

我沒有源代碼,但我想象一下:如果他們只是將'node_modules'文件夾複製到項目中並運行'npm update',它只會更新需要更新的部分。所以基本上npm已經處理好了。這就是npm的美妙之處,它將整個依賴關係樹映射到文件系統。 – Prinzhorn

+0

一週後,我可以確認每次更新模塊依賴關係並推送到heroku,只有這一個模塊從npm註冊表中獲取。比以前快得多。 – Prinzhorn

1

我加速過程的一件事是將.slugignore文件添加到主文件夾並添加所有不想運行該應用程序的文件和文件夾。 .slugignore文件

示例內容:
工作
樣機
* .PSD
的* .pdf

1

我有同樣的問題(見Avoid npm refresh after every deployment on Heroku)。

Heroku強制下載/構建/等。因爲他們需要啓動一個帶有「空白頁面」的應用程序:清除以前未刪除的文件,將應用程序移動到另一臺服務器時,分配新的Web dynos等。

問題很明顯, ,並重新編譯。對於所有僅支持js的包,我將它們與我的項目一起提交,並從package.json中刪除它們。它會增加幾秒鐘,但不是那麼多。如果你能夠訪問一個Linux機器(或虛擬機),我應該可以預編譯並提交本地模塊(我成功地在Heroku上運行wkhtml2pdf,例如,爲linux-amd64編譯的二進制文件)具有相同的配置 - 截至今天,Linux [...] 2.6.32-350-ec2 #57-Ubuntu SMP [...] x86_64 GNU/Linux

雖然我不會推薦它作爲一個明確的解決方案,因爲它可能會打破某一天 - 在我看來,heroku並沒有保證平臺上運行的應用程序。

1

我遇到了同樣的問題。

討論一些關於這裏的緩存文件夾node_moduleshttps://github.com/heroku/heroku-buildpack-nodejs/pull/37

另一個想法:https://github.com/heroku/heroku-buildpack-nodejs/issues/25


我想約幾個解決方案現在。

  1. 入住node_modules在一個單獨的分支:核心Node.js加載維護者實際上建議在node_modules文件夾到源代碼控制檢查(適用於應用,而不是庫)。我不喜歡這個。解決這個問題的一種方法可能是將一個單獨的production分支與不同的.gitignore文件分開,該文件不會忽略node_modules。當你想部署時,只需從你的主服務器進行重新綁定,並且node_modules將被簽入。至少這會讓你的主分支免於依賴。

  2. 添加preinstall腳本package.json下載壓縮ZIP依賴:您還可以添加一個推預混帳掛鉤捆綁了你的依賴,並將其上傳到S3。這可能會太慢。

  3. 修改heroku-buildpack-nodejs:與node_modules緩存整合優秀的拉力要求:

    heroku config:set BUILDPACK_URL=https://github.com/opdemand/buildpack-nodejs.git

1

好像最近有在heroku-buildpack-nodejs進展。

一旦拉入請求合併,您可以添加

heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs

heroku environment variables

現在,杜大偉的分叉庫可在

https://github.com/ddollar/heroku-buildpack-nodejs

以此爲您BUILDPACK_URL應該緩存NPM模塊。 我嘗試了node.js 0.10.5a,npm版本:1.3.5和npm_modules在.gitignore。 Tt似乎迄今爲止工作得很好!

1

檢查出新的Heroku的Node.js buildpack的這個分支,現在處於測試階段,它支持之間node_modules緩存構建:

https://github.com/heroku/heroku-buildpack-nodejs/tree/diet

要使用它:

heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs#diet -a my-node-app 
git commit -am "fakeout" --allow-empty 
git push heroku