루비의 디렉토리에서 모든 파일을 요구하는 가장 좋은 방법은 무엇입니까?
루비의 디렉토리에서 모든 파일을 요구하는 가장 좋은 방법은 무엇입니까?
어때요?
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__.
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의 제안으로 슬래시를 제거하도록 수정되었습니다.
나는 파티에 몇 년 늦었지만, 나는 한 줄 솔루션과 비슷합니다.
Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }
그리고 require_relative *Dir['relative path']어때요?
참고 URL : https://stackoverflow.com/questions/735073/best-way-to-require-all-files-from-a-directory-in-ruby
'development' 카테고리의 다른 글
| Swift 프로토콜에서 선택적 방법을 정의하는 방법은 무엇입니까? (0) | 2020.03.03 |
|---|---|
| IntelliJ에서 현재 파일 찾기 (0) | 2020.03.03 |
| 휘발성 키워드를 사용하는 이유는 무엇입니까? (0) | 2020.03.03 |
| Swift를 사용하여 앱 버전 및 빌드 번호를 어떻게 얻습니까? (0) | 2020.03.03 |
| 다형성 vs 재정의 vs 과부하 (0) | 2020.03.03 |