2011-12-30 3 views
3

동일한 이름의 루비 소스 파일을 처리하고 올바른 파일이 주어진 require 문으로로드되는지 확인하는 올바른 방법은 무엇입니까?Ruby 소스 파일 이름 충돌이 필요합니다.

배경

내 레일 3 응용 프로그램에 ruby-geometry 보석의 사용을 만들고 싶어

.

나는 루비 - 기하의 사용을 시도하고있어 Polygon 클래스 :

NameError: uninitialized constant Geometry::Polygon

: 나는 다음과 같은 오류를 얻을이 코드를 실행하려고 할 때마다

그러나
require 'geometry' # the main ruby-geometry gem file 

module SomeModule 
    def SomeMethod(vertices) 
     polygon = Geometry::Polygon.new(vertices) 

     # Do some stuff with polygon... 
    end 
end 

, 문제없이 다른 루비 지오메트리 클래스 (예 : Geometry::Point, Geometry::Segment)로 작업 할 수 있기 때문에 이상합니다.

문제점

문제는 내 애플 소스 polygon.rb라는 이름의 파일 (AN 액티브 모델을 포함) 및 so does the ruby-geometry gem이 포함되어 있다는 것입니다. 그래서 루비 - 기하학 보석 requires its own polygon.rb 결국 내 애플 리케이션의 polygon.rb로드 끝납니다. 아마도 이것은 루비가 디렉토리를 검색하는 순서에 이르기까지의 모든 것입니다.

이 명명 충돌을 해결하는 "적절한"방법은 무엇입니까?

코드 내에서 모듈을 사용하여 네임 스페이스를 구별하여 클래스 이름 충돌을 해결할 수 있습니다. require -ing 할 때 동일한 이름의 소스 파일을 구별하는 간단한 방법이 있습니까?

+0

코드 파일의 이름을 바꿀 수 있습니까? 왜 이것이 옵션이 아닌가? 그것은 그것을하는 가장 간단한 방법 일 것입니다. 이름을 'polygon_record.rb' 또는 그와 비슷한 것으로 변경하십시오. – Linuxios

+1

그것이 옵션이라고 동의하면, 이것은 단지'require' 메카니즘이 망가 졌음을 인정하는 것처럼 보인다.소스 파일의 이름을 지정할 수 있어야하지만, 이름이 내 응용 프로그램이 의존하는 n 개의 원본 파일과 충돌하지 않도록해야합니다. 또한 충돌이 두 개의 보석 (내가 쉽게 이름을 바꿀 수없는)의 소스 파일 사이에 있다면? 더 나은 해결책이 없다고 나는 믿을 수 없다. – tomtheguvnor

+0

정말로 모델의 이름을 바꾸고 싶지 않다면 절대 경로로 파일을 요구할 수 있습니다. 그러나 권장하지는 않습니다. –

답변

1

IMHO 이것은 지오메트리 보석 구현의 오류입니다. 요청한 파일의 위치를 ​​결정하기 위해 환경 변수 $LOAD_PATH에 의존합니다. 오히려 require_relative을 사용하거나 File.dirname(__FILE__) 값을 사용하여 내 보석에 상대 경로 파일을 필요로합니다. 문제를 해결하기위한

당신은 형상 보석 전에 레일$LOAD_PATH 환경 변수에 자신의 경로를 추가 요구할 수 있습니다. 나에 근무하고이 작업을 수행하는

한 가지 방법은 GEMFILE에서이 보석을 필요로 명시 적입니다 :

gem "ruby-geometry", :require => "geometry" 

또 다른 방법은 구조 보석을 필요로하기 전에 $LOAD_PATH 배열에서 app/models 경로를 제거하는 것입니다 :

old_load_path = $LOAD_PATH 
$LOAD_PATH.delete(File.expand_path("#{Rails.root}/app/models")) 
require "geometry" 
$LOAD_PATH.replace(old_load_path) 

그러나 이것은 지옥처럼 추악합니다.

+0

감사합니다. 귀하의 Gemfile 해킹이 트릭을했습니다. 보석에 대한 수정 사항을 작성하고 풀 요청을 전송하는 방법에 대해 알아 보겠습니다. – tomtheguvnor