Path (Linux), LOAD_PATH (Ruby) e autoload_paths (Rails).

Entrando no desenvolvimento Rails, você pode tropeçar em 3 caminhos diferentes:


Linux

[ $PATHvariável ambiental]

~❯ echo $PATH
/home/lakesare/.rvm/gems/ruby-2.2.1/bin:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:...

é uma : – lista dividida de caminhos absolutos de diretórios com binários, por exemplo, lsbinários. que você pode chamar sem mencionar o caminho absoluto. gostar

~❯ rails

e, se funcionar, há um binário rails em um desses caminhos. no caso de fora, em

~❯ whereis rails                                     
rails
: /home/lakesare/.rvm/gems/ruby-2.2.1/bin/rails

Rubi

[ $LOAD_PATHvariável global]

[1] irb(main)> $LOAD_PATH
=> ['/home/lakesare/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0', ...]

Rubygems sobrescreve . Rubygems gem está incluído na biblioteca padrão desde o Ruby 1.9. Quando você liga , isso é o que acontece:Kernel.require
require 'a'

O arquivo pode ser carregado do caminho de carregamento Ruby existente?

  • sim -> está carregado.

  • não -> as gemas instaladas são procuradas por um arquivo (em / lib) que corresponda. se for encontrado na gema ‘b’, essa gema é adicionada ao caminho de carregamento (ativado).


Trilhos

[ método rails]autoload_paths()

é usado para autoload constantes.

module A::B
C
# Module.nesting => [A::B]
end

quando Ruby vê constante C, para resolvê-lo, ele olha em:

  1. Cada entrada em Module.nesting

  2. Cada entrada em Module.nesting.first.ancestors

  3. Cada entrada em if é nula ou um módulo.Object.ancestorsModule.nesting.first

quando Rails vê constante C, para resolvê-lo, Rails:

  1. olha em todos os lugares que Ruby olha.

  2. se não for encontrado, liga A::B.const_missing("C"). Rails então:

    1. Procura em autoload_paths por a / b / c.rb
    2. Se um arquivo correspondente for encontrado, ele será carregado:

      1. Se a constante correta for definida, ela será retornada
      2. Caso contrário, um erro é gerado
    3. Se nenhum arquivo correspondente for encontrado, ele procura A::C, então C, a menos que já estejam definidos

    4. Se nenhuma das constantes candidatas puder ser carregada, isso gerará um NameError