Я обновил одно из своих приложений с Rails 4.2.6 до Rails 5.0.0. В Руководстве по обновлению говорится, что функция автозагрузки теперь по умолчанию отключена в производственной среде.
Теперь я всегда получаю сообщение об ошибке на своем производственном сервере, так как загружаю все файлы lib с автозагрузкой в application.rb
файл.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
На данный момент я установил config.enable_dependency_loading
значение, true
но мне интересно, есть ли лучшее решение для этого. Должна быть причина, по которой автозагрузка отключена в производственной среде по умолчанию.
lib
, один файл легко доступен во время выполнения, а другой нужноValidators
) в папки прямо в каталоге app /, поскольку там код загружается автоматически.app/services/paylinx/paylinx_service.rb
Определение класса:module Paylinx class PaylinxService end end
. Я пробовал этиautoload_paths
штуки. у меня не работает.Ответы:
Мой список изменений после перехода на Rails 5:
lib
реж вapp
потому , что весь код внутри приложения будет автоматически загружаются в разработчика и нетерпеливый загружены в прод и самое главное это autoreloaded в развитии , так что вам не нужно перезагружать сервер каждый раз , когда вы делаете изменения.require
операторы, указывающие на ваши собственные классы внутри,lib
потому что все они в любом случае автоматически загружаются, если их имена файлов / каталогов верны, и если вы оставитеrequire
операторы, это может нарушить автоматическую перезагрузку. Больше информации здесьconfig.eager_load = true
во всех средах, чтобы с радостью видеть проблемы с загрузкой кода в dev.Rails.application.eager_load!
перед игрой с потоками, чтобы избежать ошибок "циклической зависимости".Если у вас есть расширения ruby / rails, оставьте этот код в старом
lib
каталоге и загрузите их вручную из инициализатора. Это обеспечит загрузку расширений до того, как ваша дальнейшая логика может от них зависеть:источник
lib
теперь использовать папку? Я имею в виду, что перемещениеlib
dir вapp
dir похоже на обходной путь./app/lib/
поместил файл / класс, и он НЕ автозагрузился. протестирован в рельсах 5.1, новый проектRails.application.eager_load!
lib
воспринимают близость к проекту иначе, чем вещи вapp
каталоге. Некоторые другие ответы лучше этого.Я просто использовал
config.eager_load_paths
вместоconfig.autoload_paths
упоминания акостадинов в комментарии на github: https://github.com/rails/rails/issues/13142#issuecomment-275492070Он работает в среде разработки и производства.
Спасибо, Йохан, за предложение заменить
#{Rails.root}/lib
наRails.root.join('lib')
!источник
config.eager_load_paths << Rails.root.join('lib')
.config.eager_load_paths += [Rails.root.join('lib')]
Вместо этого в Rails 5.2 используется, потому чтоconfig.eager_load_paths
это замороженный массивapplication.rb
он будет работать обоими способами.Автозагрузка отключена в производственной среде из-за безопасности потоков. Спасибо @ Зелёный за ссылку.
Я решил эту проблему, сохранив файлы lib в
lib
папке в моемapp
каталоге, как рекомендовано на Github . Каждая папка вapp
папке загружается Rails автоматически.источник
config.eager_load_paths << "#{Rails.root}/lib"
, это лучше IMO, чтобы следовать рекомендуемой структуре приложения rails.app/lib
рекомендуется участниками rails github.com/rails/rails/issues/13142#issuecomment-275549669lib
. Я бы подождал, пока зазвонит нежная любовь или DHH. А пока я (лично) рекомендую придерживаться ответа @Lev Lukomsky./lib
каталог вам вообще не нужен . Сторонние библиотеки в большинстве случаев представляют собой драгоценные камни, а если нет, то должен быть создан гем. Для других файлов я создаю в/app
каталоге определенные папки . Напримерvalidators
.Вот долгая дискуссия по этому поводу. https://github.com/rails/rails/issues/13142
источник
Это позволяет иметь автоматическую перезагрузку библиотеки, а также работает в производственной среде.
PS Я изменил свой ответ, теперь он добавляет к обоим путям автозагрузки, независимо от среды, что позволяет работать и в пользовательских средах (например, на сцене)
источник
Просто измените config.autoload_paths на config.eager_load_paths в файле config / application.rb. Потому что в rails 5 автозагрузка по умолчанию отключена для производственной среды. Для получения более подробной информации перейдите по ссылке .
Он работает как для разработки среды, так и для производства.
источник
В некотором смысле, здесь представлен единый подход в Rails 5 для централизации конфигурации готовности и автозагрузки, в то же время он добавляет требуемый путь автозагрузки всякий раз, когда настроена активная загрузка, иначе она не сможет работать правильно:
источник
Для тех, кто боролся с этим, как я, недостаточно просто разместить каталог
app/
. Да, вы получите автозагрузку, но не обязательную перезагрузку, которая требует соблюдения соглашений об именах .Кроме того, использование инициализатора для загрузки старого корневого уровня
lib
предотвратит перезагрузку во время разработки.источник
Перемещение папки lib в приложение помогло решить проблему, мой API Twitter не работал в производственной среде. У меня была «неинициализированная константа TwitterApi», и мой Twitter API находился в моей папке lib. У меня был
config.autoload_paths += Dir["#{Rails.root}/app/lib"]
файл application.rb, но он не работал до перемещения папки.Это сработало
источник
резюмируя ответ Льва:
mv lib app
было достаточно, чтобы все моиlib
код был автоматически загружен / перезагружен.(rails 6.0.0beta3, но должен работать и на rails 5.x)
источник