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



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

我的测试代码依赖于minitest-reporters

,而minitest-reporters又依赖于ruby-progressbar。 Ruby-progressbar 定义了一个名为 ProgressBar 的类(也在任何模块/命名空间之外)。

作为 Ruby 的新手,我花了令人尴尬的时间来追踪两个ProgressBar类冲突的事实。我知道如何对自己的代码进行命名空间以防止此类问题,但是有没有办法解决第三方代码中的此类冲突?

更新

minitest-journalists的所有者非常友善地用另一个进度库PowerBar替换了他对(显然被放弃的)进度条的使用。所以这解决了我的问题。但你猜怎么着 - PowerBar 还会污染全局命名空间!这在 Ruby 中似乎是病态的......

如果你面对

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

  • 如果它在您自己的代码中(不适用于此特定情况):命名空间您的 friggin 常量!
  • 如果它在别人的代码中:提交一个错误,告诉他们为他们的 friggin 常量命名!并等待他们发布新版本...

你真的无能为力。

最新更新