Rails 6 поставляется с двумя режимами автозагрузки: zeitwerk и classic. В том пул-реквесте https://github.com/discourse/discourse/pull/8083 я обновил Rails до версии 6.0.0, используя классический автозагрузчик как переходный этап. Было бы интересно попробовать переключиться на Zeitwerk.
Zeitwerk — это эффективный и потокобезопасный загрузчик кода для Ruby. Пока проект следует соглашениям об именовании, Zeitwerk может находить правильные файлы и загружать их по требованию или заранее, без необходимости использовать require или require_dependency. Кроме того, согласно этой статье https://weblog.rubyonrails.org/2019/2/22/zeitwerk-integration-in-rails-6-beta-2/, это может дать небольшой прирост производительности приложения.
Мне нужно выполнить несколько шагов, чтобы это заработало:
-
Переименовать несколько классов, чтобы они соответствовали соглашениям об именовании в Rails. Например, файл
canonical_url.rbдолжен определять классCanonicalUrl, а неCanonicalURL. Аналогично, файлondiff.rbдолжен определять классOnpdiff, а неONPDiff. Альтернативный подход — подключить собственный инфлектор к проекту, однако я считаю, что следование соглашениям может быть лучшим выбором — GitHub - fxn/zeitwerk: Efficient and thread-safe code loader for Ruby · GitHub -
Как и в предыдущем пункте, по соглашению пользовательские валидации, находящиеся в директории
validations, должны быть обернуты в модульValidations. Кроме того, некоторые валидации наследуются отEachValidatorи должны быть доступны без пространства имен. Я планирую переместить их в отдельную директорию и добавить в пути автозагрузки. -
Удалить все
require_dependencyи убедиться, что проект работает. -
Удалить все
requireи убедиться, что Discourse работает. -
Убедиться, что все плагины могут получить доступ к необходимым зависимостям. Пока я не знаю, как этого добиться. Сначала я хочу запустить Discourse без каких-либо плагинов.
Конечно, всё ещё есть множество неизвестных, которые нужно решить. Я буду держать вас в курсе прогресса, однако, если вы заинтересованы в просмотре, я начал экспериментировать с этим здесь: Commits · KrisKotlarek/discourse · GitHub
Пожалуйста, дайте знать, если вы видите какие-либо недостатки внедрения Zeitwerk или считаете, что я что-то упустил.