2012-07-04 5 views
3

내 프로젝트는 progress_bar에 따라 달라지는 Sunspot에 달려 있습니다. progress_bar는 ProgressBar이라는 클래스 (모듈/네임 스페이스 외부에있는 클래스)를 정의합니다.제 3 자 보석 코드에서 이름 충돌 해결

내 테스트 코드는 minitest-reporters에 달려 있으며, 이는 ruby-progressbar에 따라 다릅니다. ruby-progressbar는 ProgressBar이라는 클래스 (모듈/네임 스페이스 외부에있는 클래스)를 정의합니다.

Ruby에 익숙하지 않아 두 개의 ProgressBar 클래스가 충돌한다는 사실을 추적하는 데 시간이 너무 많이 걸렸습니다. 이러한 문제를 방지하기 위해 내 자신의 코드를 네임 스페이스하는 방법을 알고 있지만 타사 코드에서 이러한 충돌을 해결할 수있는 방법이 있습니까?

업데이트는 :

minitest - 기자의 소유자

은 매우 친절, PowerBar는 또 다른 진행 라이브러리로 (분명히 포기)의 ProgressBar의 자신의 사용을 대체했다. 그래서 이것이 내 문제를 다루었 다. 그러나 PowerBar는 또한 글로벌 네임 스페이스를 오염시킵니다. 당신의 자신의 코드에서 (이 특별한 경우에 해당되지 않음)이라면 이건 그냥 ...

답변

2
  • 를 루비의 병적 인 것 같다 네임 스페이스 당신의 빌어 먹을 상수를!
  • 누군가 다른 사람의 코드에있는 경우 : 네임 스페이스에 friggin constants라는 버그를 신고하십시오. ... 새 버전을 출시 할 때까지 기다려주세요 ...

정말 더 할 수있는 일이 없습니다.

+1

포크 파워 바 (Fork PowerBar), ** 네임 스페이스의 고정 소거 ** ** 풀 요청을 제출하십시오. PR을 병합 할 때까지 Gemfile에서 분기 된 버전을 사용할 수 있습니다. –

+0

이것은 항상 옵션은 아니며 질문에 실제로 대답하지 않습니다. – LandonSchropp

7

당신이

# alice_bad_code.rb 

class ProgressBar 
    def initialize 
    puts "Alice bad code progress bar created" 
    end 
end 

class AliceBadCode 
    def initialize 
    @progress_bar = ProgressBar.new 
    end 
end 

# bob_bad_code.rb 

class ProgressBar 
    def initialize 
    puts "Bob bad code progress bar created" 
    end 
end 

class BobBadCode 
    def initialize 
    @progress_bar = ProgressBar.new 
    end 
end 

에 직면하는 경우 그럼 난 루비 메타 프로그래밍에

require "alice_bad_code" 
class AliceBadCode 
    ProgressBar = ::ProgressBar 
end 
Object.send(:remove_const, "ProgressBar") 

require "bob_bad_code" 
class BobBadCode 
    ProgressBar = ::ProgressBar 
end 
Object.send(:remove_const, "ProgressBar") # Just in case 

에 오신 것을 환영합니다 같은 것을 해보고 싶었어요!

그러나 제 3 자 라이브러리를 원숭이에게 패치하는 가장 좋은 방법은 원숭이에게 패치를 적용하는 것이 아니라 Jorg W Mittag의 답변에 따라 버그 보고서를 제출하는 것입니다.

관련 문제