2016-07-05 29 views
62

我已經將我的一個應用程序從Rails 4.2.6升級到了Rails 5.0.0。 Upgrade Guide表示,默認情況下,自動加載功能現在在生產中處於禁用狀態。Rails 5:在生產中加載lib文件

現在我總是在我的生產服務器上出現錯誤,因爲我在application.rb文件中加載了帶有自動加載的所有lib文件。

module MyApp 
    class Application < Rails::Application 
     config.autoload_paths += %W(lib/) 
    end 
end 

現在,我已經設置了config.enable_dependency_loadingtrue,但我不知道是否有更好的解決了這一點。默認情況下,自動加載功能在生產中已被禁用。

+0

你有沒有想出解決辦法? – dkam

+0

瘋狂的事情,文檔仍然告訴你做auto_load。我很困惑生產環境中出現新的應用程序時出了什麼問題。自從我開始學習Rails 5以來,我沒有閱讀遷移指南。我提出了一個文檔問題,希望能夠解決這個問題:https://github.com/rails/rails/issues/27268 – akostadinov

+0

令人驚訝的是,我在'lib'目錄中有兩個文件,一個文件很容易在運行時使用,但另一個文件需要手動:D – illusionist

回答

22

由於線程安全,自動加載在生產環境中被禁用。感謝@Зелёный的鏈接。

我解決了這個問題,通過將我的目錄中的lib文件夾中的lib文件存儲在Github上推薦。 app文件夾中的每個文件夾都由Rails自動加載。

+4

如果你不想挖掘Github上的長篇討論帖,你可以在這裏找到蒸餾解釋:http://collectiveidea.com/blog/archives/2016/07/22/solutions-to -potential-upgrade-problems-in-rails-5/ – Ernest

+3

我使用了'config.eager_load_paths <<「#{Rails.root}/lib」',這更符合推薦的rails應用程序結構。 – akostadinov

+1

將lib放在'app/lib'中是由rails成員推薦的 https://github.com/rails/rails/issues/13142#issuecomment-275549669 – eXa

90

我的移動之後的更改列表到Rails 5:

  1. lib目錄到app,因爲裏面的應用程序的所有代碼自動加載在開發渴望加載在督促,最重要的是autoreloaded在開發過程中,每次進行更改時都不必重新啓動服務器。
  2. 刪除任何指向lib中您自己的類的require語句,因爲如果它們的文件/目錄命名正確,它們全部自動加載,並且如果留下require語句,它可能會中斷自動重新加載。更多信息here
  3. 在所有環境中設置config.eager_load = true以便在dev中熱切地看到代碼加載問題。
  4. 在播放線程之前使用Rails.application.eager_load!以避免「循環依賴」錯誤。
  5. 如果您有任何ruby/rails擴展,請將該代碼保留在舊的lib目錄中,並從初始化程序手動加載它們。這將確保擴展您進一步的邏輯,可以依賴於它之前加載:

    # config/initializers/extensions.rb 
    Dir["#{Rails.root}/lib/ruby_ext/*.rb"].each { |file| require file } 
    Dir["#{Rails.root}/lib/rails_ext/*.rb"].each { |file| require file } 
    
+2

那麼現在如何使用'''lib'''文件夾呢?我的意思是將'''lib'''目錄移動到'''app'''目錄看起來有點像解決方法。 –

+1

'/ app/lib /'放置了一個文件/類,它不是自動加載的。在rails 5.1中測試,新項目 –

+7

值得注意的是,你需要停止彈簧。我把所有東西都移到了app/lib /,然後浪費了一些時間,想知道爲什麼我仍然無法從控制檯使用我的類。春天停止ftw :) – jacklin

16

我只是用config.eager_load_paths,而不是像config.autoload_paths提到akostadinov在GitHub上評論: https://github.com/rails/rails/issues/13142#issuecomment-275492070

# config.autoload_paths << Rails.root.join('lib') 
config.eager_load_paths << Rails.root.join('lib') 

它適用於開發和生產環境。

謝謝Johan建議您用Rails.root.join('lib')代替#{Rails.root}/lib

+1

工程就像一個魅力。我不喜歡語法,所以把它改成了'config.eager_load_paths << Rails.root.join('lib')'。 –

0

將lib文件夾移動到應用程序有助於解決問題,我的Twitter API不會在生產環境中運行。我有「未初始化的恆定TwitterApi」和我的Twitter API在我的lib文件夾中。 我在我的application.rb中有config.autoload_paths += Dir["#{Rails.root}/app/lib"],但在移動文件夾之前它不工作。

這奏效了

2

這使得有LIB自動重,並在生產環境中也起作用。

P.S.我已經改變了我的答案,現在增加了兩個eager-自動加載路徑,無論環境,允許自定義環境工作過(如舞臺)

# config/initializers/load_lib.rb 
... 
config.eager_load_paths << Rails.root.join('lib') 
config.autoload_paths << Rails.root.join('lib') 
... 
+2

您能否介紹一下爲什麼解決了這個問題? –

+0

@ Stuart.Sklinar這允許lib自動重新加載,並且也可以在生產環境中工作。附:我已經改變了我的答案,現在它增加了兩個熱切的自動加載路徑,無論環境如何,以允許在自定義環境中工作(如舞臺) – bjornmelgaard

+0

您可以擴展(在您的答案)? 只有代碼答案並不能真正幫助任何人理解爲什麼它應該以這種方式完成 - 我應該添加我不是Ruby開發人員,只是幫助清理SO。給「代碼唯一答案」添加一些評論會給它一些實際的上下文。 –

相關問題