ruby のディレクトリからすべてのファイルを要求する最良の方法は何ですか?
11 に答える
どうですか:
Dir["/path/to/directory/*.rb"].each {|file| require file }
それが要求を行うファイルに関連するディレクトリである場合(たとえば、libディレクトリ内のすべてのファイルをロードしたい場合):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
編集:以下のコメントに基づいて、更新されたバージョン:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
require_allgemを試してください。
それはあなたに簡単にさせます:
require_all 'path/to/directory'
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
拡張子を取り除かないと、同じファイルを 2 回要求することになる可能性があります (ruby は、「foo」と「foo.rb」が同じファイルであることを認識しません)。同じファイルを 2 回要求すると、誤った警告が表示される可能性があります (たとえば、「警告: 定数が既に初期化されています」)。
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
または、特定のフォルダーにロードするようにファイルをスコープする場合は、次のようにします。
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
説明:
Dir.globはブロックを引数として取ります。
method(:require)は require メソッドを返します。
&method(:require) は、メソッドをブロックに変換します。
最善の方法は、ディレクトリをロード パスに追加してから、require
各ファイルのベース名を追加することです。これは、誤って同じファイルを 2 回要求することを避けたいためです (多くの場合、意図した動作ではありません)。require
ファイルがロードされるかどうかは、以前に渡されたパスを見たかどうかに依存します。たとえば、この単純な irb セッションは、同じファイルを誤って 2 回要求してロードできることを示しています。
$ 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
最初の 2 行true
は、同じファイルが 2 回ともロードされたことを意味します。パスが使用されている場合、パスが同じ場所を指してrequire
いても、そのファイルが既に必要であったことがわかりません。
ここでは代わりに、ロード パスにディレクトリを追加し、その中の各 *.rb ファイルのベース名を要求します。
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
ファイルが複数回必要になることを気にしない場合、またはファイルの内容をロードするだけの場合は、おそらく のload
代わりに を使用する必要がありrequire
ます。この場合は load を使用してください。これは、達成しようとしていることをより適切に表現するためです。例えば:
Dir["/path/to/directory/*.rb"].each {|file| load file }
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
require file
end
これは、相対パスを使用しないローカル マシンとリモート (Heroku など) で再帰的に機能します。
Rails では、次のことができます。
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新: @Jiggneshh Gohel の提案で修正され、スラッシュが削除されました。