我的项目依赖于Sunspot,而Sunspot又依赖于progress_bar。 progress_bar定义了一个名为ProgressBar
的类(在任何模块/命名空间之外)。
,而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 常量命名!并等待他们发布新版本...
你真的无能为力。