Como a pasta `lib` de plugins é adicionada ao `$LOAD_PATH`

Percebi que, ao criar um plugin, se eu adicionar uma pasta lib com alguns arquivos nela, consigo usar require, pois ela é incluída no $LOAD_PATH.

Por exemplo, o plugin docker_manager possui um arquivo lib/docker_manager/git_repo.rb. Então, ao executar o console do Rails (rails c), posso escrever require 'docker_manager/git_repo'.

Tenho curiosidade em saber como o Discourse torna todos esses caminhos disponíveis.

Notei que, no arquivo /lib/plugin/instance.rb, se eu comentar a linha 671 self.instance_eval File.read(path), path, o require deixa de funcionar. No entanto, não entendo como o instance_eval adicionaria diretórios ao load_path.

Muitos arquivos plugin.rb inicializam um Rails Engine, que adiciona vários itens ao caminho de carregamento.

Quando não temos um Rails Engine, você verá muitas chamadas de require_relative no topo do arquivo plugin.rb para compensar.

Acho que isso ocorre porque o instance_eval está executando o arquivo plugin.rb. Se o plugin.rb não for executado, o Rails Engine nunca será criado e os caminhos extras não serão adicionados ao load_path.

3 curtidas

Obrigado! Isso me ajudou a entender.

Eu estava tentando implementar o mesmo sistema de plugins e meu problema era que eu os ativava mais tarde, fora do application.rb, em um inicializador, por exemplo. Assim, o diretório lib (e provavelmente outras pastas) dos plugins não é adicionado ao caminho de carregamento.

2 curtidas