2011-11-04 119 views
48

我更喜歡而不是以開發模式連接JavaScript文件,但將它們作爲單個文件提供。所以我配置:如何避免以開發模式提供預編譯資源?

development.rb:

config.assets.compress = false 
config.assets.debug = true 
config.assets.compile = true 

在我的/應用/資產/ JavaScript的目錄,我有:

  • reviews.js
  • 評論/
    • foo.js
    • bar.js

reviews.js:

//= require jquery 
//= require jquery_ujs 
//= require_tree ./reviews 

我包括JavaScript的在我的佈局使用<%= javascript_include_tag "reviews" %>。生成的頁面單獨正確地引用這三個腳本,並且reviews.js基本上是空的。到現在爲止還挺好。

現在,當我使用rake assets:precompile預編譯我的資產進行生產時,三個JavaScript文件連接成reviews.js。這對於生產來說都很好,但現在,處於開發模式,連接的reviews.js服務於另外到兩個單獨的文件。

當然,這會導致各種討厭的錯誤發展,因爲現在,foo.jsbar.js的內容被提供兩次,其中一個在reviews.js的潛在舊版本中。

我如何確保Rails在開發模式下不使用預編譯資產?

回答

52

這聽起來像是你在本地進行預編譯。由於文件存在於預期位置,因此它們將由開發人員服務器提供服務,並且請求不會轉到鏈接。

停止此操作的唯一方法是刪除編譯的文件。

通常你不需要在本地編譯。預計幾乎所有情況下,預編譯任務都將在部署應用程序期間運行。在資產管道指南頁面上有一個Capistrano配方。

如果您確實需要將這些文件本地提交到您的回購站,則可以使用分支來避免該問題。爲生產代碼保留主分支,併爲dev創建第二個分支。只在主人上編譯和提交資產。當你切換到dev時,他們將會消失。根據需要將開發合併到主設備中。

編輯:確保您強制您的瀏覽器進行更新(控制+ F5),或者您可以從瀏覽器緩存中找到使用的舊資產!

+0

謝謝你的建議,我本地刪除編譯後的文件和配置已經他們混帳推到Heroku的編譯。 –

+1

這是我需要的答案。確實,在我開發過程中,我並不需要這些預編譯資產,但是當我正在學習如何配置資產管道時,我確實需要他們在本地測試我的生產模式,而不是等待Heroku上的驚喜!現在我要改變目錄名(或把它們放到一個git分支上),但仍然是一個恥辱,這是我需要考慮的另一件事,而不是在開發環境中配置選項來說「忽略公共/資產目錄「,這是我所希望的。 – Phantomwhale

+1

您可能不得不忘記清除瀏覽器緩存,因此瀏覽器不會使用在rm -rf'd public/assets –

1

我試過這個,它的工作。rake assets:precompile RAILS_ENV=production

我觀察到的資產管道的新版本做這個當您運行rake assets:precompile確實rake assets:precompile:all

80

config/environments/development.rb集:

config.assets.prefix = "/assets_dev" 

使得發展模式Rails會在那裏尋找(但它不會找到任何東西,因爲您不會在開發中編譯資產(這實際上是您要做的 - 不是編譯資產))。

當預編譯的生產,使用

RAILS_ENV=production rake assets:precompile 

所以它編譯成默認的文件夾資產,public/assets

+15

這應該是選定的答案。很好的發現。 –

+1

應該指出的是,這種改變會改變Rails在其URL中使用的「assets /」路徑,以便獲得像「http://127.0.0.1:3000/assets_dev/favicon.ico」這樣的圖像。 –

+0

預先編譯資產。所以這是最好的答案。否則,您將需要繼續刪除和重新生成資產。 –

15

config/environments/development.rb集:

config.serve_static_assets = false 

,並沒有文件從/public將送達

+3

請記住,公共文件夾中的任何上傳文件都不會被提供,所以最好避免這種情況。 –

+1

在後一版本中,它已被更改爲'config.serve_static_files' –

相關問題