Comment le dossier `lib` des plugins est ajouté au `$LOAD_PATH`

J’ai remarqué que lors de la création d’un plugin, si j’ajoute un dossier lib avec quelques fichiers à l’intérieur, je peux utiliser require car ce dossier est ajouté au $LOAD_PATH.

Par exemple, le plugin docker_manager contient un fichier lib/docker_manager/git_repo.rb. Ensuite, en lançant la console Rails (rails c), je peux écrire require 'docker_manager/git_repo'.

Je suis curieux de savoir comment Discourse rend tous ces chemins accessibles ?

J’ai remarqué que dans le fichier /lib/plugin/instance.rb, si je commente la ligne 671 self.instance_eval File.read(path), path, alors require ne fonctionne plus. Cependant, je ne comprends pas comment instance_eval ajouterait des répertoires au load_path.

De nombreux fichiers plugin.rb initialisent un Rails Engine, ce qui ajoute divers éléments au chemin de chargement.

Lorsqu’il n’y a pas de Rails Engine, vous verrez de nombreuses appels à require_relative en haut du fichier plugin.rb pour compenser.

Je pense que cela est dû au fait que instance_eval exécute le fichier plugin.rb. Si plugin.rb n’est pas exécuté, le Rails Engine n’est jamais créé et les chemins supplémentaires ne sont pas ajoutés au load_path.

3 « J'aime »

Merci ! Cela m’a aidé à comprendre.

Je tentais d’implémenter le même système de plugins, et mon problème venait du fait que je les activais plus tard, en dehors de application.rb, dans un initialiseur par exemple. Ainsi, le dossier lib (et probablement d’autres dossiers) des plugins n’est pas ajouté au chemin de chargement.

2 « J'aime »