Ho notato che, quando creo un plugin, se aggiungo una cartella lib e alcuni file al suo interno, posso usare require perché viene aggiunta a $LOAD_PATH.
Ad esempio, il plugin docker_manager contiene un file lib/docker_manager/git_repo.rb. Quindi, eseguendo la console di Rails con rails c, posso scrivere require 'docker_manager/git_repo'.
Sono curioso di sapere come Discourse rende disponibili tutti questi percorsi.
Ho notato che nel file /lib/plugin/instance.rb, se commento la riga 671 self.instance_eval File.read(path), path, il comando require non funziona. Tuttavia, non capisco come instance_eval possa aggiungere directory a load_path.
Molti file plugin.rb inizializzano un Rails Engine, che aggiunge varie cose al load path.
Quando non abbiamo un Rails Engine, vedrai molti chiamate a require_relative in cima al file plugin.rb per compensare.
Credo che questo sia dovuto al fatto che instance_eval esegue il file plugin.rb. Se plugin.rb non viene eseguito, allora il Rails Engine non viene mai creato e i percorsi aggiuntivi non vengono aggiunti al load_path.
Stavo cercando di implementare lo stesso sistema di plugin e il mio problema era che li stavo attivando più tardi, fuori da application.rb, ad esempio in un initializer. In questo modo, la cartella lib (e probabilmente altre) dei plugin non viene aggiunta al load path.