386 Stimmen

Beste Weg, um alle Dateien aus einem Verzeichnis in Ruby erfordern?

Was ist der beste Weg, um alle Dateien aus einem Verzeichnis in Ruby erfordern?

36voto

Ryan McGeary Punkte 228632

Am besten ist es, das Verzeichnis zum Ladepfad hinzuzufügen und dann require den Basisnamen der einzelnen Dateien. Damit soll vermieden werden, dass dieselbe Datei versehentlich zweimal benötigt wird - was oft nicht beabsichtigt ist. Ob eine Datei geladen wird oder nicht, hängt davon ab, ob require hat den Pfad schon einmal gesehen, der ihm zugewiesen wurde. Diese einfache irb-Sitzung zeigt zum Beispiel, dass man fälschlicherweise dieselbe Datei zweimal anfordern und laden kann.

$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false

Beachten Sie, dass die ersten beiden Zeilen true was bedeutet, dass beide Male die gleiche Datei geladen wurde. Wenn Pfade verwendet werden, selbst wenn die Pfade auf denselben Ort zeigen, require weiß nicht, dass die Datei bereits benötigt wurde.

Hier fügen wir stattdessen ein Verzeichnis zum Ladepfad hinzu und verlangen dann den Basisnamen jeder *.rb-Datei darin.

dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }

Wenn es Ihnen egal ist, dass die Datei mehr als einmal benötigt wird, oder wenn Sie nur den Inhalt der Datei laden wollen, können Sie load sollte stattdessen verwendet werden require . Verwenden Sie in diesem Fall load, weil es besser ausdrückt, was Sie zu erreichen versuchen. Zum Beispiel:

Dir["/path/to/directory/*.rb"].each {|file| load file }

17voto

Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
  require file
end

Dies funktioniert rekursiv auf Ihrem lokalen Rechner und einem Remote-Rechner (wie Heroku), der keine relativen Pfade verwendet.

17voto

Koen. Punkte 22804

Anstelle der Verkettung von Pfaden, wie in einigen Antworten, verwende ich File.expand_path :

Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
  require file
end

Aktualisierung:

Anstelle der Verwendung von File.dirname könnten Sie Folgendes tun:

Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
  require file
end

Wo .. entfernt den Dateinamen von __FILE__ .

8voto

Dan Kohn Punkte 32574

In Rails können Sie das tun:

Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }

Update: Auf Anregung von @Jiggneshh Gohel korrigiert, um Schrägstriche zu entfernen.

3voto

Jazz Punkte 1355

Ich bin zwar ein paar Jahre zu spät dran, aber ich mag diese Ein-Zeilen-Lösung, die ich verwendet habe, um Rails dazu zu bringen, alles in app/workers/concerns aufzunehmen:

Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X