0

本月,我從Rails 3.0升級到Rails 3.1 - 本週我試圖在生產模式下啓動服務器 - 今天我碰壁了!無法在本地生產軌上通過流水線配置資產3.1.3服務器

我不能讓我的生產環境中的服務器通過資產管道服務於我的公共資產(JavaScript和CSS),除非我在environment.rb文件中設置config.assets.compile = true,這對於速度的原因我明明穿上」不想做。

我有大量的JS和CSS文件,每個文件都傾向於在一個或兩個不同的頁面上使用。這意味着創建單個「清單」文件不適合我的用法,因爲每個頁面都需要稍微不同的內容。我也希望一些CSS不會很好地坐在一起。因此,我放下了「簡單工作」的方法,希望稍後整理大量的CSS/JS。

這裏是production.rb文件:

Implicit::Application.configure do 
    ... 

    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 

    # I set this to true, as I am testing this locally, just running a local Thin server 
    config.serve_static_assets = true 

    config.assets.compress = true 

    # Setting this to false removes the issue - but is SLOW 
    config.assets.compile = true 

    config.assets.digest = true 

    # This is overkill - but does get EVERYTHING precompiled for now 
    config.assets.precompile += %w(*.css *.js) 

    config.action_dispatch.x_sendfile_header = nil 
    ... 
end 

這對我來說相當新的領域,所以我花了很多當今切換這些布爾和停止/啓動局部瘦/ Rails的服務器去嘗試一下。但唯一值得注意的是編譯標誌。

我的application.rb文件是非常標準的,它有config.assets.enabled = trueconfig.assets.initialize_on_precompile = false在裏面,後者從一個heroku文章(和猜測,再次)。

我有一個完全填充public/assets目錄,與bundle exec rake assets:precompile命令,大約需要20分鐘到我的老氣的筆記本電腦(5年)運行,可能是與創建與「一網打盡」預編譯正則表達式,雖然行註釋,它仍然需要超過10分鐘

隨着編譯標誌設置爲true,我能看到這些資產的副本我/tmp/cache目錄中得到創建(!) - 這顯然是應用程序創建它自己的「編抄」的資產。

將編譯標誌設置爲false,我遇到了jquery.reveal isn't precompiled的錯誤消息(在日誌中,除非我設置請求爲本地,然後我在錯誤頁上看到它)。但是,當我去http://localhost:3000/assets/jquery.reveal.js JavaScript文件被提供。

我的應用程序佈局造成這個的線路是:

<%= javascript_include_tag "application", "jquery.reveal" %> 

我曾試圖改變這種jquery.reveal到jquery.reveal.js沒有變化。刪除它修復了索引頁面,除了jquery.reveal功能已經消失了!很顯然,application.js正在被正確地提供。我只是不明白爲什麼jquery.reveal不是,因爲我可以在public/assets目錄中看到預編譯的文件。

+0

請仔細檢查管道指南最後一部分的所有配置選項,如果沒有顯示任何問題,請發佈index.html.erb的內容以及應用程序中的任何Rails幫助器調用.RB? – 2012-01-18 08:14:07

+0

最初發布的錯誤消息來自使用過期的「生產」數據庫,並且來自我的安全代碼。已更新最後兩段顯示新的錯誤 - 我回來讓jquery.reveal沒有被發現! – Phantomwhale 2012-01-19 03:11:08

回答

1

這是一個有趣的問題,我認爲可能有兩個錯誤 - 一個是你鏈接的,另一個是:文件正在被編譯爲錯誤的名稱。可能值得嘗試生成一個可以用錯誤報告提交的最小測試用例。

對此的解決方法 - 我懷疑這就是爲什麼很少有人似乎有這個問題 - 是使用次級清單(鏈接庫僅通過清單似乎是一個不斷髮展的最佳實踐)。

創建一個名爲home.js並且只需要一個文件即可。

這並不是一個壞的方法。這些額外的清單必須添加到預編譯數組中(請參閱指南),並允許多個庫在多個頁面或部分上共享,而不必每次鏈接它們。

+0

這看起來像一個很好的解決方法 - 當然,我想要採取我的代碼(預編譯數組將是必須的,我有很多來自第三方模板的JS/CSS代碼)的一步。剛剛在一個全新的項目上重現了這個問題,所以今天就試着將它寫入一個錯誤報告。 – Phantomwhale 2012-01-19 04:12:58

+0

我已經提出了上述問題在rails github網站上https://github.com/rails/rails/issues/4535 – Phantomwhale 2012-01-19 06:25:58

+0

看起來像另一個用戶已經遇到了這個問題的編譯標誌=真正的情況下:http: //stackoverflow.com/questions/7640808/assets-say-not-precompiled-when-they-are-precompiled/8921998 – Phantomwhale 2012-01-19 06:43:55

1

回答我的問題在這裏,但看起來它可能是與「期間」如jquery.reveal

問題報告解析資產(錯誤https://github.com/rails/rails/ issue/3398)報告了這一點,並突出顯示了一個提交(https://github.com/sstephenson/sprockets/commit/4ba5b32764a9073671df5e77355df6ed2bb3d3c9),它發生在Sprockets 2.0.3之後 - 這是rails 3.1.3所依賴的默認版本。因此升級Sprocket將涉及到3.2穩定的導軌 - 對於這個新手來說有點出血!

但是,錯誤報告確實說這隻發生在config.assets.compile = true時 - 我確實看到,雖然這是在我的代碼中,jquery.reveal被動態編譯爲jquery-8fu ... 8g.reveal.js jquery.reveal-8fu ... 8g.js)。

所以也許這不是答案。至少我希望事實並非如此。但是,就我所知,包含CSS/JS文件的「非時期」文件服務很好,但是肯定會繼續關注這個時期的問題。