Rails 6 est livré avec deux modes d’autoloading : zeitwerk et classic. Dans cette pull request DEV: Upgrading Discourse to Rails 6 by KrisKotlarek · Pull Request #8083 · discourse/discourse · GitHub, j’ai mis à niveau Rails vers la version 6.0.0 en utilisant l’autoloader classic comme phase de transition. Il serait intéressant d’essayer de passer à Zeitwerk.
Zeitwerk est un chargeur de code efficace et sûr pour les threads en Ruby. Tant que le projet respecte les conventions de nommage, Zeitwerk peut trouver les fichiers corrects et les charger à la demande ou immédiatement, sans avoir besoin d’utiliser require ou require_dependency. De plus, cela peut offrir un léger gain de performance à l’application, selon cet article : https://weblog.rubyonrails.org/2019/2/22/zeitwerk-integration-in-rails-6-beta-2/
Voici quelques étapes que je dois effectuer pour que cela fonctionne :
-
Changer le nom de quelques classes pour respecter la convention de nommage de Rails. Par exemple, le fichier
canonical_url.rbdevrait définir la classeCanonicalUrlau lieu deCanonicalURL. De même, le fichierondiff.rbdevrait définir la classeOnpdiffau lieu deONPDiff. Une approche alternative consisterait à attacher un inflector personnalisé au projet, mais je pense que respecter la convention est un meilleur choix : GitHub - fxn/zeitwerk: Efficient and thread-safe code loader for Ruby · GitHub -
De même que pour le point précédent, par convention, les validations personnalisées situées dans le répertoire
validationsdoivent être enveloppées dans le moduleValidations. Par ailleurs, certaines validations héritent deEachValidatoret doivent être accessibles sans espace de noms. Je prévois de les déplacer dans un répertoire séparé et de les ajouter aux chemins d’autoloading. -
Supprimer tous les
require_dependencyet s’assurer que le projet fonctionne. -
Supprimer tous les
requireet s’assurer que Discourse fonctionne. -
S’assurer que tous les plugins peuvent accéder aux dépendances requises. Je ne sais pas encore comment y parvenir. Je souhaite d’abord faire fonctionner Discourse sans aucun plugin.
Bien sûr, il reste encore de nombreuses inconnues à résoudre. Je vous tiendrai informé de l’avancement, mais si vous souhaitez jeter un coup d’œil, j’ai commencé à expérimenter cela ici : Commits · KrisKotlarek/discourse · GitHub
Merci de me faire part de tout inconvénient que vous voyez à l’implémentation de Zeitwerk ou si vous pensez que j’ai oublié quelque chose.