現在のディレクトリとすべてのサブディレクトリにすべての.rbファイルをロードする必要があるAPIを作成しています。現在、追加するファイルごとに新しいrequireステートメントを入力していますが、ファイルをサブディレクトリの1つに配置して自動的に追加する必要がある場所に作成したいと考えています。Rubyでディレクトリ内のすべてのファイルを再帰的に要求することはできますか?
標準的なコマンドがありますか?
現在のディレクトリとすべてのサブディレクトリにすべての.rbファイルをロードする必要があるAPIを作成しています。現在、追加するファイルごとに新しいrequireステートメントを入力していますが、ファイルをサブディレクトリの1つに配置して自動的に追加する必要がある場所に作成したいと考えています。Rubyでディレクトリ内のすべてのファイルを再帰的に要求することはできますか?
標準的なコマンドがありますか?
require "find"
Find.find(folder) do |file|
next if File.extname(file) != ".rb"
puts "loading #{file}"
load(file)
end
これは、各.rb
ファイルを再帰的にロードします。この場合
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スクリプトに矛盾する定義がある場合、いくつかの非明示的な方法で解決されるかもしれません(フォルダ/ファイル名のアルファベット順)。
ロードコールで 'f'と直接マッチングしないのはなぜですか? – Geo
'File.fnmatch( '* .rb'、f)'というステートメントを参照している場合、ファイル名 'f'がパターン' * .rb'と一致する場合、ステートメントは真を返します。これにより、私たちはルビスクリプトだけをロードし、フォルダー内にある可能性のある他のファイルは確実にロードしません。 .rbw拡張子を使用するスクリプトがある場合は、別の条件を追加する必要があります。 – bta
はい。しかし、f =〜/ \。rb/'なら' load(f) 'を使うことができました。私は組み込み正規表現のサポートに対してfnmatchを使用している理由を指していました。 – Geo
ミゲル・フォンセカは言ったが、ルビー> = 2であなたが行うことができますように。
Dir[File.expand_path "lib/**/*.rb"].each{|f| require_relative(f)}
私は宝石require_allのすべての時間を使用し、それはあなたの中に次のパターンで仕事が必要となります:
require 'require_all'
require_all './lib/exceptions/'
注:不明なファイルの集合を要求するのは危険で、エラーにつながる可能性もあります。 die.rbというファイルにexitステートメントを付けたファイルを置いてみましょう(申し訳ありませんが、実際のコードはありません。私はRubyを一度も使用しませんでした)、ロードされるとすぐにプログラムは終了します。または、ユーザーがファイルを削除するとどうなりますか?そのファイルによって提供される関数はロードされません。 ファイルを含めてセキュリティ上の問題を無視したいだけで、何らかのチェック機能を呼び出すことによってロードされていることを確認する場合は、Rubyの経験はありません。 – HalfBrian