373

ruby のディレクトリからすべてのファイルを要求する最良の方法は何ですか?

4

11 に答える 11

489

どうですか:

Dir["/path/to/directory/*.rb"].each {|file| require file }
于 2009-04-09T17:19:59.157 に答える
361

それが要求を行うファイルに関連するディレクトリである場合(たとえば、libディレクトリ内のすべてのファイルをロードしたい場合):

Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }

編集:以下のコメントに基づいて、更新されたバージョン:

Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
于 2009-04-09T18:50:45.150 に答える
106

require_allgemを試してください。

  1. http://github.com/jarmo/require_all
  2. https://rubygems.org/gems/require_all

それはあなたに簡単にさせます:

require_all 'path/to/directory'
于 2009-06-14T04:08:58.200 に答える
52
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file| 
  require File.basename(file, File.extname(file))
end

拡張子を取り除かないと、同じファイルを 2 回要求することになる可能性があります (ruby は、「foo」と「foo.rb」が同じファイルであることを認識しません)。同じファイルを 2 回要求すると、誤った警告が表示される可能性があります (たとえば、「警告: 定数が既に初期化されています」)。

于 2010-02-09T18:38:29.880 に答える
47
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) は、メソッドをブロックに変換します。

于 2014-02-11T04:56:29.833 に答える
35

最善の方法は、ディレクトリをロード パスに追加してから、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 }
于 2009-04-09T23:28:14.937 に答える
17
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
  require file
end

これは、相対パスを使用しないローカル マシンとリモート (Heroku など) で再帰的に機能します。

于 2011-06-19T05:53:06.847 に答える
7

Rails では、次のことができます。

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

更新: @Jiggneshh Gohel の提案で修正され、スラッシュが削除されました。

于 2014-09-25T21:06:35.183 に答える