O Rails 6 vem com dois modos de carregamento automático: zeitwerk e classic. Naquele pull request DEV: Upgrading Discourse to Rails 6 by KrisKotlarek · Pull Request #8083 · discourse/discourse · GitHub, atualizei o Rails para a versão 6.0.0 com o carregador automático clássico como uma fase transitória. Seria interessante tentar migrar para o Zeitwerk.
O Zeitwerk é um carregador de código eficiente e seguro para threads em Ruby. Desde que o projeto siga as convenções de nomenclatura, o Zeitwerk consegue encontrar os arquivos corretos e carregá-los sob demanda ou antecipadamente, sem a necessidade de qualquer require ou require_dependency. Além disso, conforme mencionado naquele artigo https://weblog.rubyonrails.org/2019/2/22/zeitwerk-integration-in-rails-6-beta-2/, ele pode oferecer um pequeno aumento de desempenho para a aplicação.
Existem algumas etapas que preciso realizar para fazê-lo funcionar:
-
Alterar o nome de algumas classes para seguir a convenção de nomenclatura do Rails. Por exemplo, o arquivo
canonical_url.rbdeve definir a classeCanonicalUrlem vez deCanonicalURL. Da mesma forma, o arquivoondiff.rbdeve definir a classeOnpdiffem vez deONPDiff. Uma abordagem alternativa seria conectar um inflector personalizado ao projeto; no entanto, acredito que seguir a convenção seja uma escolha melhor — GitHub - fxn/zeitwerk: Efficient and thread-safe code loader for Ruby · GitHub -
Similar ao ponto anterior, por convenção, validações personalizadas localizadas no diretório
validationsdevem ser envoltas pelo móduloValidations. Além disso, algumas validações herdam deEachValidatore devem ser acessíveis sem namespace. Planejo movê-las para um diretório separado e adicioná-las aos caminhos de carregamento automático. -
Remover todos os
require_dependencye garantir que o projeto esteja funcionando. -
Remover todos os
requiree garantir que o Discourse esteja funcionando. -
Garantir que todos os plugins possam acessar as dependências necessárias. Ainda não sei como alcançar isso. Quero primeiro fazer o Discourse funcionar sem nenhum plugin.
Claro, ainda há muitas incógnitas a resolver. Manterei você atualizado sobre o progresso; no entanto, se você tiver interesse em acompanhar, comecei a experimentar isso aqui: Commits · KrisKotlarek/discourse · GitHub
Por favor, me avise se você identificar alguma desvantagem na implementação do Zeitwerk ou se acha que deixei algo passar.