답변:
어때요 :
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
's 주기적 종속성 해결은 소스 코드의 문제를 해결하는 데 도움이됩니다. 종속성이 필요없는 Ruby 소스 파일이 있습니다. 이렇게하면 메스 로딩시 도어가 닫히고 전혀로드되지 않거나 전혀로드되지 않습니다. 소규모 도서관에서는 문제가되지 않지만 의식적으로 결정해야합니다.
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
확장명을 제거하지 않으면 동일한 파일을 두 번 요구하게됩니다 (루비는 "foo"와 "foo.rb"가 같은 파일이라는 것을 인식하지 못합니다). 동일한 파일을 두 번 요구하면 가짜 경고 (예 : "경고 : 이미 초기화 된 상수")가 발생할 수 있습니다.
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
각 파일의 기본 이름 을 추가하는 것 입니다. 의도하지 않은 동일한 파일을 실수로 두 번 요구하지 않기를 원하기 때문입니다. 파일로드 여부 require
는 이전에 전달 된 경로를 보았는지 여부에 따라 다릅니다 . 예를 들어,이 간단한 irb 세션은 실수로 같은 파일을 두 번 요구하고로드 할 수 있음을 보여줍니다.
$ 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
처음 두 줄 true
은 같은 파일이 두 번로드되었다는 것을 의미합니다. 경로가 사용되는 경우 경로가 동일한 위치를 가리켜도require
파일이 이미 필요한지 알 수 없습니다.
대신로드 경로에 디렉토리를 추가 한 다음 각 * .rb 파일의 기본 이름이 필요합니다.
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
파일이 두 번 이상 필요한 것에 신경 쓰지 않거나 파일의 내용을로드하려는 의도라면 load
대신 대신 사용해야합니다 require
. 이 경우로드를 사용하십시오. 달성하려는 것을 더 잘 표현하기 때문입니다. 예를 들면 다음과 같습니다.
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']
루비 스크립트가 하나만 있으면 작동합니다. 그러나 여러 루비 스크립트가 발견되면require_relative': wrong number of arguments (4 for 1) (ArgumentError)