Cet article est publié sous licence CC BY-NC-SA
Lorsque vous écrivez une bibliothèque, un serveur Rack ou tout autre application en Ruby, il peut être pratique de faire en sorte que vos classes soient chargées automatiquement. Dès qu’elles sont référencées dans le code, on peut vouloir qu’elles soient chargées si elles ne le sont pas déjà. Il n’y a donc plus besoin de maintenir à la main une série de require
explicites.
Zeitwerk est un outil qui permet de gérer cette tâche pour nous. C’est un chargeur de code efficace et thread-safe. C’est ce qui est utilisé notamment par Rails ou encore Hanami pour faire en sorte que le code applicatif soit chargé au besoin.
En respectant des conventions de nommage, Zeitwerk peut automatiquement charger les classes soit :
Une fois mis en place, plus besoin de require
explicite dans le code. Vous pouvez vous concentrer sur l’écriture du métier en sachant que toutes vos classes et modules seront disponibles où que vous soyez dans le code.
De plus Zeitwerk est capable de fournir du rechargement automatique des classes et modules lorsque leur code change. Cette fonctionnalité s’avère très pratique lors des phases de développement. Plus besoin de couper et relancer le serveur / application pour que vos modifications soient effectives.
Pour que Zeitwerk puisse faire son travail, il faut nommer ses fichiers d’une manière précise. Le chemin et le nom du fichier doit refléter le nom de la classe / module et ses éventuels namespaces :
lib/my_gem.rb -> MyGem
lib/my_gem/foo.rb -> MyGem::Foo
lib/my_gem/bar_baz.rb -> MyGem::BarBaz
lib/my_gem/woo/zoo.rb -> MyGem::Woo::Zoo
Si vous travaillez sur une gem, Zeitwerk met à disposition une configuration automatique permettant de détecter les classe et modules à traquer :
# lib/my_gem.rb (main file)
require "zeitwerk"
loader = Zeitwerk::Loader.for_gem
loader.setup
module MyGem
# ...
end
Il suffit donc, dans le fichier qui fait office de point d’entrée de votre gem, de requérir Zeitwerk, puis de lui demander de s’occuper de l’auto-chargement des fichiers de votre gem.
La structure des gems étant conventionnée, Zeitwerk sait ce qu’il doit surveiller.
Vous pouvez ensuite développer votre gem classiquement mais sans vous soucier des require
.
Si vous travaillez sur un projet Ruby qui n’est pas une gem, il sera à votre charge de préciser les dossiers à traquer :
loader = Zeitwerk::Loader.new
loader.push_dir("#{__dir__}/models")
loader.setup
Pendant les phases de développement, il est pratique d’avoir du rechargement automatique de votre code pour ne pas avoir à couper puis relancer l’application à chaque modification.
Pour que votre code soit rechargé automatiquement lorsqu’il change, il faudra explicitement activer la fonctionnalité. Il suffit d’ajouter loader.enable_reloading
avant le loader.setup
, soit quelque chose comme :
# lib/my_gem.rb (main file)
require "zeitwerk"
loader = Zeitwerk::Loader.for_gem
loader.enable_reloading
loader.setup
module MyGem
# ...
end
Zeitwerk est un outil développé par Xavier Noria, vous pourrez trouver plus d’informations sur la page du projet.
L’équipe Synbioz.
Libres d’être ensemble.
Nos conseils et ressources pour vos développements produit.