簡體   English   中英

Ruby on Rails:heroku運行rake資產:預編譯

[英]Ruby on Rails: heroku run rake assets:precompile

請幫助我理解heroku run rake assets:precompile究竟是什么。 自從我開始在rails上使用ruby之后,我總是在推送到github和heroku之前運行這三個命令:

bundle exec rake assets:precompile

RAILS_ENV=production bundle exec rake assets:precompile

在我推到heroku后,我會跑:

heroku run rake assets:precompile

但是,當我在上次推送到heroku后嘗試運行它時,我在不同的文件上遇到了一堆相同的錯誤。 例如:

Warning. Error encountered while saving cache ... can't dump anonymous class ...

為了看看我能解決這個問題,我跑了

heroku run rake assets:clean然后heroku run rake assets:precompile再次heroku run rake assets:precompile 問題是一切都運轉良好,但我覺得如果有這些警告/錯誤。 請幫我理解。 謝謝!

預編譯

為了給你一些更清晰的定義 - Heroku並不是唯一需要你“預編譯”你的資產的系統。 資產預編譯是大多數Rails生產環境的先決條件,因為它允許您提供靜態資產(文件) - 完美的速度和效率

以下是Rails文檔中有關它的內容:

在生產環境中,Sprockets使用上面概述的指紋識別方案。 默認情況下,Rails假設資產已經過預編譯,並且將由Web服務器作為靜態資產提供。

在預編譯階段,MD5從編譯文件的內容生成,並在寫入光盤時插入文件名。 Rails助手使用這些指紋名稱代替清單名稱。

Heroku希望您預編譯資產的原因是因為Heroku環境的設計是為了提高速度和效率; 因此,不希望在為應用程序的每個請求/實例編譯組件時花費CPU功率

這意味着您必須自己預編譯資產,或者讓Heroku buildpacks為您排序


Heroku的

正如CWitty所提到的,您需要確保在本地編譯資產。 雖然我不確定你收到的錯誤,但我確實知道一件事: 預編譯填充public/assets文件夾

這意味着如果您提交到Heroku 之前在本地進行預編譯,那么嘗試在Heroku上運行應用程序之前 ,您將擁有public/assets目錄中的所有最新資產。

雖然Heroku確實執行預編譯作為構建過程的一部分,但通過在本地預編譯,您將更安全(從異常的角度來看):

$ rake assets:precompile RAILS_ENV=production

這將使您能夠填充public/assets文件夾,然后允許您毫無問題地推送到Heroku

你應該在推送到Heroku之前運行這個命令,因為它** **編譯你的資產。 如果你缺少一個manifast.yml文件,Heroku將自動運行此命令。 運行rake assets:precompile在本地rake assets:precompile ,您可以提交所有更改,然后推送到Heroku。

對於任何無法弄清楚為什么Heroku不會自動編譯資產的人:

如果在您的應用中檢測到public / assets / manifest.yml,Heroku將假定您自己正在處理資產編譯,並且不會嘗試編譯您的資產。 Rails 4使用名為public / assets / manifest-.json的文件。 在這兩個版本上,您可以通過運行$ rake assets來生成此文件:在本地預編譯並將結果文件檢入Git。

我找到了一個sprockets-manifest-*.json和Heroku在我刪除這個文件后開始自動編譯我的資產。

在我的例子中,這個文件是由rails_composer腳本rails_composer

如果您有任何.jpeg,請確保在編譯之前將它們更改為.jpg。 編譯步驟將為您完成,但如果您使用擴展名指定文件,則image_tags將關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM