2012-06-06 2 views
1

저는 파일 시스템의 위치를 ​​포함하여 보석 메타 데이터에 대한 액세스를 제공하는 라이브러리를 개발 중입니다. 아이디어는 보석 저자는 모든 스크립트에서 상대 경로로 설정하게하는 것이 었습니다 :어떻게 보석의 위치를 ​​찾을 수 있습니까?

# $root/example.gemspec 
Example::Gem.root '.'  # => $root/ 

# $root/lib/example/gem.rb 
Example::Gem.root '../..' # => $root/ 

그런 다음, 현재 스크립트의 경로는 절대 경로를 계산하는 데 사용된다.

def root(relative_to = nil, file = __FILE__) 
    unless relative_to.nil? 
    @root = File.expand_path relative_to, File.dirname(file) 
    end 
    @root 
end 

내가 __FILE__ 호출자의 스크립트의 경로를 반환 생각했지만, 그 가정은 잘못 다음과 같이 내 구현은 현재이다.

그것은 라이브러리 자체에서 작동했지만 다른 보석과 통합하려고 시도했을 때 고장났습니다. 생성 된 경로는 항상 지원 라이브러리 자체에 상대적이었습니다.

모든 통화에 현재 __FILE__을 전달하지 않고 어떻게 구현할 수 있습니까? 그렇지 않으면 얻게 될 가치가별로 없다. root('../..', __FILE__)을 쓰는 것은 같은 것을하기위한 실제 방법을 쓰는 것과 거의 같습니다.

아무 것도 지정하지 않고도 경로를 알아낼 수 있다면이라는 문자가 더 좋을 수도 있지만 아무 것도 생각할 수 없습니다. Rails는 어떻게합니까?

그런데 나는 Gem::Specification#gem_dir을 알고 있지만, 실제로 거기에 보석이 없더라도 항상 설치 디렉토리를 기준으로 경로를 반환하므로 개발 환경에서 쓸모 없게 만듭니다.

caller.first 

그것은 파일과 줄의 아말감을 생산하지만, 일반적으로 :로 구분됩니다 :

+2

caller.first' '작업 필요에 따라 문자열을 엉망으로되어 시작하는 장소. 더 나은 버전이 있는지 확실하지 않습니다. – tadman

+0

@tadman은 정의 된 메서드 구현의 출력이 아닙니다. 어쨌든, 내가 찾아 볼게. –

+0

@ tadman, 솔루션이 작동합니다! 어떤 문제가 있는지는 잘 모르겠지만 [문서에서] 읽은 것 (http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-caller) , 그것은 내가 필요한 것을 해줍니다. 내가 그것을 받아 들일 수 있도록 적절한 대답을 추가하십시오! –

답변

1

당신은 항상 제공하는 역 추적 기능을 사용할 수있다. 줄 정보를 무시하고 나머지는 보존함으로써 어떤 이유로 든 콜론을 포함 할 수있는 파일 이름이나 경로를 허용하도록주의해야합니다. 즉,하지 split하지만 sub을 수행

caller.first.sub(/:\d+:in .*$/, '') 
+1

머리를 주셔서 감사합니다! [내 코드를 패치했습니다.] (https://github.com/matheusmoreira/jewel/commit/91beef313532ead964f20190557027099972f3b5). 문서는'caller'가'file : line'이나'file : line : in method' 형식으로 문자열을 반환 할 수 있기 때문에'/ : \ d + (: in * *)? \ z /'를 사용했습니다. –

관련 문제