Rails 5: загрузка файлов lib в производство

Я обновил одно из своих приложений от Rails 4.2.6 до Rails 5.0.0. В Руководстве по обновлению указано, что функция Autoload отключена по умолчанию.

Теперь я всегда получаю сообщение об ошибке на моем рабочем сервере, так как я загружаю все файлы lib с автозагрузкой в ​​файл application.rb .

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

На данный момент я установил для параметра config.enable_dependency_loading значение true но мне интересно, есть ли лучшее решение для этого. Должна быть причина, по которой автозагрузка отключена в производстве по умолчанию.

    Мой список изменений после перехода на Rails 5:

    1. Поместите lib dir в app потому что весь код внутри приложения автоматически загружается в dev и загружается в prod и, самое главное, автоматически загружается в процессе разработки, поэтому вам не нужно перезапускать сервер при каждом изменении.
    2. Удалите любые require инструкции, указывающие на собственные classы внутри lib потому что все они автоматически загружаются, если имена файлов / dir верны, и если вы оставите require операторы, это может сломать автозагрузку. Больше информации здесь
    3. Установите config.eager_load = true во всех средах, чтобы увидеть проблемы с загрузкой кода с нетерпением в dev.
    4. Используйте Rails.application.eager_load! перед игрой с streamами, чтобы избежать ошибок «круговой зависимости».
    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 } 

    Я просто использовал config.eager_load_paths вместо config.autoload_paths как упоминание akostadinov на github comment: 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}/lib с Rails.root.join('lib') !

    Автозагрузка отключена в производственной среде из-за безопасности streamов. Спасибо @ Зелёный за ссылку.

    Я решил эту проблему, сохранив файлы lib папке lib каталоге app как рекомендовано в Github . Каждая папка в папке app автоматически загружается Rails.

    Должна быть причина, по которой автозагрузка отключена в производстве по умолчанию.

    Вот длинная дискуссия по этому вопросу. https://github.com/rails/rails/issues/13142

    Это позволяет использовать lib autoreload и работать в рабочей среде.

    PS Я изменил свой ответ, теперь он добавляет как нетерминальные пути автозагрузки, независимо от среды, так и работу в настраиваемых средах (например, этап)

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

    Для тех, кто боролся с этим, как я, недостаточно просто разместить каталог под app/ . Да, вы получите автозагрузку, но не необходимую перезагрузку, что требует выполнения соглашений об именах .

    Кроме того, использование инициализатора для загрузки старой корневой lib предотвратит перезагрузку во время разработки.

    В некотором смысле, это унифицированный подход в Rails 5 для централизации конфигурации с нетерпением и автозагрузки, в то же время он добавляет требуемый путь автозагрузки всякий раз, когда настраивается загруженная загрузка, иначе он не сможет работать правильно:

     # config/application.rb ... config.paths.add Rails.root.join('lib').to_s, eager_load: true # as an example of autoload only config config.paths.add Rails.root.join('domainpack').to_s, autoload: true ... 

    Перемещение папки lib в приложение помогло решить проблему, мой Twitter api не запускался на производстве. У меня был «неинициализированный постоянный TwitterApi», и мой Twitter API был в моей папке lib. У меня был config.autoload_paths += Dir["#{Rails.root}/app/lib"] в моем приложении.rb, но он не работал, прежде чем перемещать папку.

    Это сделало трюк

    Interesting Posts
    Давайте будем гением компьютера.