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'
#...
'development' 카테고리의 다른 글
java.exe -jar로 내 jar를 실행하는 동안 NoClassDefFoundError가 발생했습니다… 무엇이 잘못 되었나요? (0) | 2020.12.29 |
---|---|
URL의 URL 인코딩 슬래시 (0) | 2020.12.29 |
LINQ 확장 메서드-Any () 대 Where () 대 Exists () (0) | 2020.12.29 |
sbt / play에 대해 컬러 터미널 출력을 비활성화하려면 어떻게해야합니까? (0) | 2020.12.29 |
UITableViewCell 배경색이 작동하지 않는 이유는 무엇입니까 (인터페이스 빌더에서 설정)? (0) | 2020.12.29 |