2010-06-19 5 views
5

나는 내부 용 보석을 만들고 있습니다. 그것은, 나는 또 다른 디렉토리에서 일부 YAML를로드 : 나는 오히려 initializer.rbdata/root.yaml의 위치에 의존하지 않는 게 좋을Ruby에서 특정 상대 경로의 파일을 어떻게로드합니까?

# in <project_root>/bin/magicwand 
MagicWand::Configuration::Initializer.new(...) 

# in <project_root>/lib/magicwand/configuration/initializer.rb 
root_yaml = YAML.load_file(
    File.expand_path("../../../../data/#{RootFileName}", __FILE__)) 

# in <project_root>/data/root.yaml 
--- 
apple: 100 
banana: 200 
coconut: 300 

. 대신, 나는 <project_root>에 대한 참조를 얻고 거기에서 상대 경로에 의존합니다. 더 똑똑한 움직임처럼 보입니다.

먼저이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 둘째, 그렇다면 어떻게해야합니까? 다양한 File 메소드를 체크 아웃했는데 그런 것은 없다고 생각합니다. Ruby 1.9를 사용하고 있습니다.

는 지금, 나는 특별한 일정을 작성하고 그 대신에 따라 달라집니다

# in lib/magicwand/magicwand.rb 
module MagicWand 
    # Project root directory. 
    ROOT = File.expand_path("../..", __FILE__) 
end 

하지만 나도 그 방식을 좋아 모르겠어요.

답변

4

항상 실행중인 주 파일이있는 경우 해당 파일을 참조 지점으로 사용할 수 있습니다. 해당 파일의 (현재 디렉토리 사이)의 상대 경로는 그래서입니다 당신이

path_to_root_yaml = File.dirname($0) + '/data/root.yaml' 
+0

을 (즉, 기본 파일 및 root.yaml 사이의 상대 경로입니다 가정) data/root.yaml에 상대 경로를 얻기 위해, $0에있을 것입니다 좋은 생각이지만 테스트 중에는 전체 응용 프로그램 스택을 실행하는 대신 클래스를 직접 단위 테스트 할 때 중단됩니다. 이 경우 (테스트 러너에 대한 경로, 내 애플리케이션이 아닌) '$ 0'이 다를 수 있습니다. –

+0

테스트 중에 스텁 (stub) 할 수있는 간단한 개체에 조회를 감싸십시오. – Theo

관련 문제