解决第三方gem代码中的名称冲突

时间:2012-07-04 21:56:11

标签: ruby rubygems

我的项目取决于Sunspot,而后者又取决于progress_bar。 progress_bar定义了一个名为ProgressBar的类(在任何模块/命名空间之外)。

我的测试代码取决于minitest-reportersruby-progressbar依赖于PowerBar。 ruby-progressbar定义了一个名为ProgressBar的类(也在任何模块/命名空间之外)。

对Ruby不熟悉,我花了很多时间来追踪这两个ProgressBar类是冲突的事实。我知道如何命名我自己的代码来防止这样的问题,但有没有办法解决第三方代码中的这种冲突?

更新

minitest-reporter的所有者非常善意地将他对(显然已放弃的)ProgressBar的使用替换为另一个进度库{{3}}。所以这解决了我的问题。但是猜猜 - PowerBar还会污染全局命名空间!这似乎在Ruby中是病态的......

2 个答案:

答案 0 :(得分:10)

如果你面对

# 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的回答提交错误报告。

答案 1 :(得分:4)

  • 如果它在你自己的代码中(在这种特殊情况下不适用):命名空间你的friggin常量!
  • 如果是在别人的代码中:提交一个错误告诉他们命名他们的friggin常量! ...并等待他们发​​布新版本......

你真的不能做更多。