2012-03-26 4 views
4

In einer Gemspec kann ich die require_paths angeben, die Pfade darstellen, die ich zur Laufzeit benötigen kann. Diese werden von RubyGems in die $LOAD_PATH gesetzt.Kann ich feststellen, welche Pfade RubyGems zum Ladepfad hinzugefügt hat, damit meine Befehlszeilen-App funktioniert?

Meine Frage ist: Gibt es eine Möglichkeit zu bestimmen, was diese Pfade zur Laufzeit sind? Kann ich Elemente von $LOAD_PATH untersuchen und wissen, welche nur für mein Juwel hinzugefügt wurden?

Update: Schließlich möchte ich Ruby-Dateien dynamisch aus dem Inneren des Edelsteins z.

load_from 'foo/bar' 

Und haben Sie das finden $MY_GEMS_LIB_DIR/foo/bar/*.rb. Ich kann sicherlich durch die gesamte $LOAD_PATH Suche nach foo/bar gehen, aber ich würde es lieber nur auf den Edelstein beschränken.

+1

Können Sie erklären, welches Problem Sie lösen möchten? –

+0

die Frage mit mehr Informationen aktualisiert – davetron5000

+0

Warum verwenden Sie nicht etwas wie 'File.expand_path ('../ bar', __FILE __)', um einen absoluten Pfad zu erhalten? (Wenn ich Sie richtig verstehe, möchten Sie Ihre eigenen Dateien laden) –

Antwort

0

Sie können die $: global in Irb verwenden. Es gibt auch den gem which Befehl, der Ihnen einen Bibliothekspfad gibt, aber ich bin mir nicht sicher, ob das genau das beinhaltet, was Sie wollen.

+0

So greift man auf den Ladepfad zu. Ich weiß, wie das geht. Ich möchte sehen, welcher Teil des Ladepfads durch spezielle RubyGems für meine App geändert wurde – davetron5000

0

Sieht aus wie Gem.find_files kann Ihnen helfen.

+0

Das ist nicht ganz so; Es scheint innerhalb der installierten Edelsteine ​​zu suchen. Vielleicht ist das was ich will nicht möglich. Ich hatte gehofft, ich könnte die Ladepfade abfangen, die von dem Juwel hinzugefügt wurden, in dem mein Code gerade läuft. – davetron5000

+0

@ davetron5000 Der Ladepfad von BTW gem kann durch Bundler zu $ ​​LOAD_PATH hinzugefügt werden. In diesem Fall wird der Rubygems-Aktivierungsmechanismus überhaupt nicht verwendet. –

+0

Würde dies bei einer über RubyGems installierten Befehlszeilen-App passieren? – davetron5000

1

Ich weiß nicht, ob ich Ihre Bedürfnisse verstanden habe (mein Englisch ist schlecht: - /); wie auch immer, wenn das Problem der Verzeichnisse zu bestimmen ist, die geladen wird, wenn Sie ein Juwel benötigen, können Sie Gem::Specification.lib_dirs_glob verwenden:

Gem::Specification.find_by_name('irbtools').lib_dirs_glob 
#=> "/home/my_user/.rvm/gems/ruby-1.9.3-p125/gems/irbtools-1.2.2/lib" 

Gem::Specification.find_by_name('xyz').lib_dirs_glob 
# raises a Gem::LoadError 

So eine mögliche Implementierung von load_from sein könnte:

def load_from(gem_name, path) 
    path_to_load = File.join(Gem::Specification.find_by_name(gem_name).lib_dirs_glob, path) 
    Dir.glob(path_to_load).each(&method(:load)) 
end 

Versuch zu laden Thor::CoreExt:

Thor::CoreExt #=> NameError: uninitialized constant Thor 
load_from 'thor', 'thor/core_ext/*.rb' 
Thor::CoreExt #=> Thor::CoreExt 

Dies funktioniert auf meinem Rechner mit ruby ​​1.9.3 und 1.8.21 gem.

1

Wenn ich Sie richtig verstanden habe, sollte dies tun (Rubin 1.9.3):

before = $LOAD_PATH.dup 
require 'the_gem' 
added_paths = $LOAD_PATH - before 

Natürlich wird dies sind die Pfade von den Abhängigkeiten hinzugefügt.

Verwandte Themen