루비의 디렉토리에서 모든 파일을 요구하는 가장 좋은 방법은 무엇입니까?
답변
어때요 :
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_all gem을 사용해보십시오 :
간단하게 할 수 있습니다 :
require_all 'path/to/directory'
답변
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
확장명을 제거하지 않으면 동일한 파일을 두 번 요구하게됩니다 (루비는 “foo”와 “foo.rb”가 같은 파일이라는 것을 인식하지 못합니다). 동일한 파일을 두 번 요구하면 가짜 경고 (예 : “경고 : 이미 초기화 된 상수”)가 발생할 수 있습니다.
답변
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
각 파일의 기본 이름 을 추가하는 것 입니다. 의도하지 않은 동일한 파일을 실수로 두 번 요구하지 않기를 원하기 때문입니다. 파일로드 여부 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__
.