2012-07-23 2 views
7

Ich weiß, dass ich alle Dateien in einem Verzeichnis benötigen, kannWie benötigt man alle Dateien in einem Verzeichnis, in einem Juwel?

Dir['path/to/files/**/*.rb'].each { |file| require file } 

jedoch mit, ich versuche, dass für eine Edelstein-Setup-Datei zu tun, etwa so:

class MyGem 
    module NS; end 
end 

Dir['lib/my_gem/files/**/*.rb'].each { |file| require file } 

(wo alle Dateien in lib/my_gem/files sind Namespaced unter MyGem :: NS). Mit einer Verzeichnisstruktur, die wie folgt aussieht:

lib        
|-- my_gem       
| |-- files    
| | |-- file1.rb  
| | |-- file2.rb   
| | |-- file3.rb   
| | `-- ... (many more)  
`-- my_gem.rb      
my_gem.gemspec 

Und, na ja, der Dir Befehl scheint nicht zu arbeiten, wenn ich mein Juwel in einer anderen Datei benötigen, da sie für die Dateipfade zur Laufzeit zu suchen scheinen in meinem Projekt root (von welchem ​​Projekt auch immer ich mein Juwel benötigt habe). Wie kann ich alle Dateien in in lib/my_gem.rb anfordern?

Antwort

11

Rubygems hat eine Anlage find_files genannt, die Sie basiert alles im Lastpfad suchen können:

Gem.find_files("my_gem/files/**/*.rb").each { |path| require path } 
+0

+1 Genau das, was ich gesucht habe! – neezer

+0

Dies findet alle RB-Dateien und nicht nur Hauptdateien, wie mit jedem Edelstein müssen Sie einzelne Anweisung benötigen, um diesen Edelstein in App enthalten, müssen Sie nicht alle Dateien einzeln, sondern eine einzige benötigen –

-1

Sie können eine rekursive Suche mit find durchführen und dann die Antwortliste durchlaufen und sie Zeile für Zeile einschließen.

So etwas wie

`find #{root_path}/lib/my_gem/files/**/*.rb`.split("\n").each { |p| require p } 
+0

Dies wäre eine plattformübergreifende Ansatz nicht sein. –

Verwandte Themen