2009-12-04 20 views
16

現在のディレクトリとすべてのサブディレクトリにすべての.rbファイルをロードする必要があるAPIを作成しています。現在、追加するファイルごとに新しいrequireステートメントを入力していますが、ファイルをサブディレクトリの1つに配置して自動的に追加する必要がある場所に作成したいと考えています。Rubyでディレクトリ内のすべてのファイルを再帰的に要求することはできますか?

標準的なコマンドがありますか?

+1

注:不明なファイルの集合を要求するのは危険で、エラーにつながる可能性もあります。 die.rbというファイルにexitステートメントを付けたファイルを置いてみましょう(申し訳ありませんが、実際のコードはありません。私はRubyを一度も使用しませんでした)、ロードされるとすぐにプログラムは終了します。または、ユーザーがファイルを削除するとどうなりますか?そのファイルによって提供される関数はロードされません。 ファイルを含めてセキュリティ上の問題を無視したいだけで、何らかのチェック機能を呼び出すことによってロードされていることを確認する場合は、Rubyの経験はありません。 – HalfBrian

答えて

39

そのはlibディレクトリ下のすべてのファイルの読み込み:

Dir["#{File.dirname(__FILE__)}/lib/**/*.rb"].each { |f| load(f) } 
+1

なぜ 'require'ではなく' load'を使うのですか? – johannes

+0

どちらも使用できますが、requireには通常、ファイル名ではなく拡張子のないライブラリ名が渡されます。 –

+1

しかし 'require'は、あなたが拡張子を渡すかどうか気にしないので、私の意見ではそれが望ましいです – johannes

6
require "find" 

Find.find(folder) do |file| 
    next if File.extname(file) != ".rb" 
    puts "loading #{file}" 
    load(file) 
end 

これは、各.rbファイルを再帰的にロードします。この場合

0
def rLoad(dir) 
    Dir.entries(dir).each {|f| 
     next if f=='.' or f=='..' 
     if File.directory?(f) 
      rInclude(f) 
     else 
      load(f) if File.fnmatch('*.rb', f) 
     end 
    } 
end 

dirで指定されたディレクトリにこの必要があります再帰的にloadすべて.RBファイルを。たとえば、rLoad Dir.pwdは現在の作業ディレクトリで動作します。

これには注意してください。これは深さ優先の検索を行い、あなたのRubyスクリプトに矛盾する定義がある場合、いくつかの非明示的な方法で解決されるかもしれません(フォルダ/ファイル名のアルファベット順)。

+0

ロードコールで 'f'と直接マッチングしないのはなぜですか? – Geo

+0

'File.fnmatch( '* .rb'、f)'というステートメントを参照している場合、ファイル名 'f'がパターン' * .rb'と一致する場合、ステートメントは真を返します。これにより、私たちはルビスクリプトだけをロードし、フォルダー内にある可能性のある他のファイルは確実にロードしません。 .rbw拡張子を使用するスクリプトがある場合は、別の条件を追加する必要があります。 – bta

+0

はい。しかし、f =〜/ \。rb/'なら' load(f) 'を使うことができました。私は組み込み正規表現のサポートに対してfnmatchを使用している理由を指していました。 – Geo

0

このgemをご覧ください。それは非常に小さいので、実際に宝石全体をインストールする代わりにコードを再利用することができます。

+0

リンクが壊れています。 – juan2raid

+0

http://github.com/mlightner/require_directoryこれはうまくいくはずです。 – Waseem

2

ミゲル・フォンセカは言ったが、ルビー> = 2であなたが行うことができますように。

Dir[File.expand_path "lib/**/*.rb"].each{|f| require_relative(f)} 
2

私は宝石require_allのすべての時間を使用し、それはあなたの中に次のパターンで仕事が必要となります:

require 'require_all' 
require_all './lib/exceptions/' 
関連する問題