2012-07-04 37 views
3

我的項目取決於Sunspot,而這又取決於progress_bar。 progress_bar定義了一個名爲ProgressBar的類(在任何模塊/名稱空間之外)。解決名稱衝突在第三方寶石代碼

我的測試代碼取決於minitest-reporters,而這又取決於ruby-progressbar。 ruby-progressbar定義了一個名爲ProgressBar的類(也位於任何模塊/名稱空間之外)。

作爲Ruby的新手,我花了很多時間來追蹤這兩個類別衝突的事實。我知道如何命名空間我自己的代碼,以防止這種問題,但有沒有什麼辦法來解決第三方代碼中的這種衝突?

更新

的MINITEST-記者的主人非常親切地取代了他的(顯然廢棄)進度的使用又一進步庫,PowerBar。所以這解決了我的問題。但是猜猜 - PowerBar還會污染全局命名空間!這似乎只是在Ruby中病理...

回答

2
  • 如果它在自己的代碼(在這種特殊情況下不適用):命名空間的受詛咒的常量!
  • 如果是在別人的代碼中:提交一個錯誤告訴他們他們的friggin常量爲 ...等待他們發​​布新版本...

真的沒有更多的人可以做。

+1

Fork PowerBar,使它的**命名空間的frigging常量**,提交拉請求。 直到他們合併你的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 

歡迎Ruby的元編程的東西!

然而,猴子修補第三方庫的最佳方法不是根據Jorg W Mittag的回答來修補它,並提交錯誤報告。