development

Ruby의 동일한 디렉토리에 파일을 요구하는 더 짧은 방법이 있습니까?

big-blog 2020. 12. 29. 08:23
반응형

Ruby의 동일한 디렉토리에 파일을 요구하는 더 짧은 방법이 있습니까?


실행중인 스크립트와 동일한 디렉토리에있는 파일을 요구하는 더 짧은 방법이 있습니까?

require File.expand_path(File.dirname(__FILE__) + '/some_other_script')

나는 읽기 require "my_script"require "./my_script"실제로 (루비는이 같은 스크립트가 실제로 인식하지 않습니다)를 두 번 스크립트를로드, 왜 이것이 이유입니다 File.expand_path권장합니다 : 그것은 스크립트가 필요한 때마다 사용하는 경우, 다음은로드됩니다 한번.

Ruby와 같은 간결한 언어가 더 짧은 해결책을 가지고 있지 않은 것 같아 이상하게 보입니다. 예를 들어, 파이썬은 단순히 다음과 같습니다.

import .some_other_module_in_the_same_directory

나는 원숭이 패치를 할 수 있다고 생각합니다 require...하지만 그것은 단지 악입니다! ;-)


루비 1.9부터 require_relative.


그냥이 필요합니다 filename.

예, filename로 지정하면 두 번 가져 오므로 ./filename그렇게하지 마십시오. 을 지정 .rb하지 않았으므로 경로를 지정하지 마십시오. 일반적으로 애플리케이션 로직의 대부분을의 파일에 lib넣은 다음 다음과 같은 스크립트가 있습니다 bin.

#!/usr/bin/env ruby

$: << File.join(File.dirname(__FILE__), "/../lib")
require 'app.rb'
App.new.run(ARGV)

또 다른 장점은 애플리케이션 로직로드가 자동으로 실행을 시작하지 않는 경우 단위 테스트를 수행하는 것이 더 쉽다는 것입니다.


위의 내용은 다른 디렉토리에서 스크립트를 실행하는 경우에도 작동합니다. 그러나 동일한 디렉토리 내에서 참조하는 짧은 형식은 예상대로 작동하며 적어도 루비 1.9의 경우 이중 요구 사항이 발생하지 않습니다.

testa.rb

puts "start test A"
require 'testb'
require './testb'
puts "finish test A"

testb.rb

puts "start test B"
puts "finish test B"

'ruby testa.rb'를 실행하면 다음과 같은 결과가 나타납니다.

start test A
start test B
finish test B
finish test A

그러나 더 긴 형식은 다른 디렉토리 (예 : ruby ​​somedir / script.rb)에서도 작동합니다.


이것을 표준 라이브러리 디렉토리에 넣으십시오 (이미 기본 loadpath에있는 곳 $:) :

# push-loadpath.rb
if caller.first
  $: << File.expand_path(File.dirname(caller.first))
end

그런 다음 작동합니다.

% ls /path/to/
bin.rb lib1.rb lib2.rb #...
% cat /path/to/bin.rb
load 'push-loadpath.rb'
require 'lib1'
require 'lib2'
#...

caller현재 콜 스택에 대한 액세스를 제공하고 어떤 파일과 위치를 알려주므로이를 push-loadpath.rb사용하여로드 경로에 파일을 추가합니다 load.

본문이 여러 번 호출 될 수 있도록 load파일이 아닌 파일 이어야 합니다 require(로드 경로를 변경할 때마다 한 번씩).

또는 방법으로 본문을 감쌀 수 있습니다.

# push-loadpath.rb
def push_loadpath
  $: << File.expand_path(File.dirname(caller.first))
end

이것은 당신이 require그것을 허용하고 다음 과 같이 사용합니다.

% ls /path/to/
bin.rb lib1.rb lib2.rb #...
% cat /path/to/bin.rb
require 'push-loadpath'
push_loadpath
require 'lib1'
require 'lib2'
#...

참조 URL : https://stackoverflow.com/questions/788550/is-there-a-shorter-way-to-require-a-file-in-the-same-directory-in-ruby

반응형