2010-08-29 12 views
12

Ich habe einen Ruby-Code mit verschiedenen Klassen in ein paar Dateien. In einer Datei starte ich die Ausführung. Diese Datei require s meine anderen Dateien.Ruby erfordern Pfad

  • Ist dies ein guter Weg, um einen Ruby-Code zu starten?
  • Wenn ich den Code von einem symbolischen Link ausführen, zum Beispiel DIR2/MyRubyCode ist ein Link zu der Hauptdatei DIR1/MyRubyCode.rb, dann werden meine Anforderungen fehlschlagen. Ich löste das Problem, indem ich den Weg DIR1 zu $LOAD_PATH vor dem require hinzufügte, aber ich denke, dass es viel bessere Weisen geben würde, es zu tun. Hast du irgendwelche Vorschläge dazu?

Antwort

16

Wenn Sie, wenn ein Ruby-Datei überprüfen wollen, ist sein ‚require‚ed oder ausgeführt mit‘ruby MyRubyCode.rb‘, überprüfen Sie die __FILE__ konstant.

# If the first argument to `ruby` is this file. 
if $0 == __FILE__ 
    # Execute some stuff. 
end 

Soweit die Anforderung/$ LOAD_PATH Problem, können Sie immer den relativen Pfad in der Anforderung Anweisung verwenden. Zum Beispiel:

# MyRubyCode.rb 
require "#{File.dirname(__FILE__)}/foo_class" 
require "#{File.dirname(__FILE__)}/bar_module" 

Welche würden die foo_class.rb und bar_module.rb Dateien im selben Verzeichnis wie MyRubyCode.rb.

+1

Danke, aber wenn ich mit File.dirname (__ FILE__), wenn ich den Code mit einem Alias ​​starten will, versucht es auch von "." und ich habe immer noch den Fehler 'keine solche Datei zu laden'. –

+1

Das ist richtig. Sie müssten das Ziel des Symlinks erhalten (was anstelle von 'File.dirname()') würde. Sehen Sie sich diesen Beitrag für ein paar verschiedene Möglichkeiten an: http://stackoverflow.com/questions/1237939/ruby-how-do-i-get-the-target-of-a-symlink –

+2

Vielen Dank. Es funktioniert gut mit '$ LOAD_PATH << File.dirname (Pfadname.neu (File.expand_path (__ FILE __)). Realpath.to_s) .to_s'. –

6

Ich weiß, dass dies eine alte Frage, aber es ist eine aktualisierte Antwort darauf, und ich wollte es schreiben:

in einer neueren Version von Ruby starten (ich bin nicht sicher, wann), Sie kann unter Verwendung der folgenden im gleichen Verzeichnis-Dateien benötigen:

require './foo_class' 
require './bar_module' 

und es wird Dateien foo_class.rb und bar_module.rb im selben Verzeichnis mit dem Namen laden.

Um zu überprüfen, ob Ihre Datei require ist oder normal lief, überprüfen Sie die andere Antwort.

+2

Diese Antwort adressiert nicht den Anwendungsfall in der ursprünglichen Frage, weil es immer noch fehlschlagen wird wenn die Ruby-Datei von einem Symlink aufgerufen wird oder sich auf dem Pfad des Benutzers befindet. – Nathan

17

Wenn Sie Ruby 1.9 oder höher verwenden, benötigt der Benutzer "require_relative" für Ihre Abhängigkeiten.