# Come la cartella \`lib\` dei plugin viene aggiunta a \`$LOAD\_PATH\`

**URL:** https://meta.discourse.org/t/how-lib-folder-of-plugins-are-added-to-the-load-path/204309
**Category:** Development
**Created:** [23 Settembre 2021, 1:36pm UTC](https://meta.discourse.org/t/how-lib-folder-of-plugins-are-added-to-the-load-path/204309 "2021-09-23T13:36:09Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![AhmedLoud](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ahmedloud/32/576547_2.png) [@AhmedLoud](https://meta.discourse.org/u/AhmedLoud)
#### Post date: [23 Settembre 2021, 1:36pm UTC](https://meta.discourse.org/t/how-lib-folder-of-plugins-are-added-to-the-load-path/204309/1 "2021-09-23T13:36:09Z")

</div>

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`.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [23 Settembre 2021, 3:43pm UTC](https://meta.discourse.org/t/how-lib-folder-of-plugins-are-added-to-the-load-path/204309/2 "2021-09-23T15:43:00Z")

</div>

Molti file `plugin.rb` inizializzano un [Rails Engine](https://edgeapi.rubyonrails.org/classes/Rails/Engine.html), 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.

> [@AhmedLoud](#):
>
> Se commento la riga 671 `self.instance_eval File.read(path), path`, allora il require non funziona.

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`.

---

<div class="post-metadata">

### Author: ![AhmedLoud](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ahmedloud/32/576547_2.png) [@AhmedLoud](https://meta.discourse.org/u/AhmedLoud)
#### Post date: [23 Settembre 2021, 5:11pm UTC](https://meta.discourse.org/t/how-lib-folder-of-plugins-are-added-to-the-load-path/204309/3 "2021-09-23T17:11:24Z")

</div>

Grazie! Mi ha aiutato a capire.

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.
