2011-05-30 11 views
9

Al tratar de resolver Gem found in irb, not in Ruby, he intentado ver qué efecto tenía require 'rubygems' en mi propia instalación:¿Cómo se requiere que los rubygems ayuden a encontrar los archivos de rubygem?

$ irb 
irb(main):001:0> RUBY_VERSION 
=> "1.8.7" 
irb(main):002:0> $: 
["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."] 
=> nil 
irb(main):003:0> require "rubygems" # Hasn't been required already 
=> true 
irb(main):004:0> require "rubygems" # Will return false, because it's already been required 
=> false 
irb(main):005:0> $: # Same as before 
=> ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."] 

Si exigir a rubygems no modifica $:, entonces ¿cómo ayudar a encontrar los archivos? ¿Es monkeypatch require? Si es así, ¿qué variable usa para encontrar las bibliotecas instaladas de rubygem?

Respuesta

13

Aquí está la versión actual de la fuente relevante: https://github.com/rubygems/rubygems/blob/02ead548e38ff90923444fa7c0ff9f6a5dbd87b0/lib/rubygems/custom_require.rb. (Edit:. here's an earlier version (1.5.2) que expresa más claramente lo que sucede)

Los documentos dicen:

Cuando se requiere RubyGems, Kernel#require se sustituye por nuestra cuenta, que es capaz de gemas de carga en la demanda.

Cuando se llama a require 'x', esto es lo que sucede:

  • Si el archivo se puede cargar desde el LOADPATH Rubí existente, es .
  • De lo contrario, las gemas instaladas se buscan un archivo que coincida. Si se encuentra en gem 'y', esa gema se activa (se agrega a la ruta de carga ).

El require funcionalidad normal de devolver false si se conserva ese archivo ya se ha cargado.

Lo hace mediante la apertura de module Kernel y aliasing el original requerir con alias gem_original_require require, a continuación, la redefinición de require llamar primero la versión original, y mirar las gemas si eso no funciona.

Así que la trayectoria de carga sólo se modifique cuando se requiere una joya:

ruby-1.8.7-p330 :002 > $:.length 
=> 9 
ruby-1.8.7-p330 :003 > require 'rubygems' 
=> true 
ruby-1.8.7-p330 :004 > $:.length 
=> 9 
ruby-1.8.7-p330 :005 > require 'haml' 
=> true 
ruby-1.8.7-p330 :006 > $:.length 
=> 10 
+0

¿Conoce lo que la variable se utiliza? –

+1

@Andrew 'Gem.path' podría ser lo que estás buscando. – matt

Cuestiones relacionadas