回答:
どうですか:
Dir["/path/to/directory/*.rb"].each {|file| require file }
require
は、.rb
拡張機能の有無に混乱しない。MRI 1.8.7-p374、2.1.5、2.2.0でテスト済み。この都市の伝説はRailsに由来し、「賢い」オートローディングは彼が以前のバージョンで説明している動作を示しました(そしてそれをまだ表示している可能性があります)。
それが必要とするファイルに関連するディレクトリである場合(たとえば、libディレクトリ内のすべてのファイルをロードしたい場合):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
編集:以下のコメントに基づいて、更新されたバージョン:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each {|file| require file }
Dir[File.join(File.dirname(__FILE__), 'lib', '*.rb')].each {|file| require file }
__dir__
代わりに使用できますFile.dirname(__FILE__)
。
require_relative
ディレクトリ内のすべてのファイルを要求するにはどのように使用しますか?
require_all gemを試してください:
それはあなたに簡単にさせます:
require_all 'path/to/directory'
require_all
の循環的な依存関係の解決は、ソースコードの問題を回避することに注意してください。依存関係を必要としないRubyソースファイルがあります。これにより、メスの読み込みのドアが閉まり、オールオアナッシングの読み込みが行われます。これは小さなライブラリでは問題ではありませんが、意識的に行うべき決定です。
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
拡張子を取り除かないと、同じファイルが2回必要になる可能性があります(Rubyは「foo」と「foo.rb」が同じファイルであることを認識しません)。同じファイルを2回要求すると、誤った警告(「警告:すでに初期化された定数」など)が発生する可能性があります。
require "foo.rb"; require "foo";
ロードされますfoo.rb
一度だけ。
require
は.rb
拡張機能の有無によって混乱することはありません。MRI 1.8.7-p374、2.1.5および2.2.0でテスト済み。この都市の伝説はRailsに由来し、「巧妙な」オートローディングは古いバージョンで説明されている動作を示しました(それでもそれを示す場合があります)。
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)は、メソッドをブロックに変換します。
Dir.glob( File.join( File.dirname(__FILE__), '{lib,addons}', 'subfolder', '**', '*.rb' ), &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
は同じファイルが両方ともロードされたことを意味することに注意してください。パスが使用されている場合、パスが同じ場所を指してrequire
いても、ファイルがすでに必要であることがわかりません。
ここでは代わりに、ロードパスにディレクトリを追加し、その中にある各* .rbファイルのベース名を要求します。
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
ファイルが2回以上必要になることを気にしない場合、またはファイルのコンテンツをロードするだけの場合は、のload
代わりに使用する必要がありrequire
ます。この場合は、loadを使用してください。これは、達成しようとしていることをよりよく表現するためです。例えば:
Dir["/path/to/directory/*.rb"].each {|file| load file }
いくつかの回答のようにパスを連結する代わりに、私はFile.expand_path
次を使用します:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
更新:
を使用File.dirname
する代わりに、次のことを行うことができます。
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
はの..
ファイル名を取り除きます__FILE__
。
File.expand_path
Rails.root.join
レールにいる場合も、さまざまな回答が機能します。
Railsでは、次のことができます。
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新:@Jiggneshh Gohelの提案によりスラッシュを削除するように修正されました。
Rails.root.join('/lib')
正しいパスが生成されません。私はこれが正しく機能することを発見しました:Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
そして、どうrequire_relative *Dir['relative path']
ですか?
require_relative *Dir['*.rb']
ルビスクリプトが1つしかない場合は機能します。複数のRubyスクリプトが検出された場合でも、あなたが得るrequire_relative': wrong number of arguments (4 for 1) (ArgumentError)