[ruby] 루비의 디렉토리에서 모든 파일을 요구하는 가장 좋은 방법은 무엇입니까?

루비의 디렉토리에서 모든 파일을 요구하는 가장 좋은 방법은 무엇입니까?



답변

어때요 :

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을 사용해보십시오 :

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

간단하게 할 수 있습니다 :

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__.