programing

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

bestprogram 2023. 7. 6. 22:24

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

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

어때요?

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(:message)는 require 메서드를 반환합니다.

"method"(:dll)는 메서드를 블록으로 변환합니다.

"" "" "" "" "" " " " " " " " 입니다.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 }

는 어떤에 일부답변같경연대신결는하로를이과,대▁like신▁instead▁use▁i는연을 사용합니다.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

에▁where디..▁of의 파일 합니다.__FILE__.

Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
  require file
end

이것은 상대 경로를 사용하지 않는 원격(Heroku와 같은)과 로컬 컴퓨터에서 재귀적으로 작동합니다.

레일에서 다음 작업을 수행할 수 있습니다.

Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }

업데이트: 슬래시를 제거하기 위해 @Jiggnesh Gohel의 제안으로 수정되었습니다.

파티에 몇 년 늦었지만, 애플리케이션/작업자/문제에 모든 것을 포함하도록 레일을 만들곤 했던 이 한 줄 솔루션이 마음에 듭니다.

Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }

이 모든 대답은 훌륭합니다.또한 자동으로 이 작업을 수행하려면 레일즈가 파일을 로드하는 데 사용하는 Zeitwerk를 사용할 수 있습니다.

require 'zeitwerk'
loader = Zeitwerk::Loader.new
loader.push_dir('main/src/dir')
loader.setup

그러면 모든 것이 모든 것에 접근할 수 있습니다.

3.0 이전 버전의 Ruby의 경우, Rubocop은 모든 OS에 대해 로드 순서가 결정적이지 않기 때문에 허용된 답변에 대해 경고합니다.Linux는 Mac 또는 Windows와 달리 대문자와 소문자를 구분합니다.다음은 OP가 모든 버전의 Ruby에 대해 요청한 작업을 수행합니다.

Dir['/path/to/directory/*.rb'].sort.each { |file| require file }

다음은 모든 버전의 Ruby에 대한 모든 하위 디렉터리를 통해 반복됩니다.

Dir['/path/to/directory/**/*.rb'].sort.each { |file| require file }

Ruby 3.0 이상에서는 파일을 일관되게 정렬하므로 이전 버전의 Ruby가 절대 사용되지 않을 것임을 알고 있다면 다음만 있으면 됩니다.

Dir['/path/to/directory/*.rb'].each { |file| require file }

다음은 Ruby 3.0 이상의 모든 하위 디렉터리를 통해 반복됩니다.

Dir['/path/to/directory/**/*.rb'].each { |file| require file }

그리고 다음은 어떻습니까?require_relative *Dir['relative path']?

언급URL : https://stackoverflow.com/questions/735073/best-way-to-require-all-files-from-a-directory-in-ruby