我认为通过现有的 Ruby 工具无法实现您想要的。但是,如果您在依赖依赖项时的向后兼容性纯粹是语法/使用问题,而不是版本之间的低级差异,那么您不必导入和维护旧 gem 的代码。您还有另一种选择:在您的 gem 中创建一个“shim”层,该层从依赖项的新接口或旧接口提供您需要的功能。
在实践中,它可能看起来像这样,例如假设它是Thingy
已更改的类的构造函数:
module DependencyShim
def new_Thingy( new_style_args )
if thingy_is_new
Thingy.new( new_style_args )
else
Thingy.new( convert_args_to_old_style( new_style_args ) )
end
end
# convert_args_to_old_style() not shown
private
def thingy_is_old
Thingy::VERSION < '1.3.4'
end
def thingy_is_new
Thingy::VERSION >= '1.3.4'
end
end
更好的抽象很可能是可能的,但很难预测,因为我不知道新旧差异的本质,以及您的代码与您的依赖关系的紧密程度。
如果版本之间存在根本性的变化,并且您自己的 gem 大量使用依赖项,这显然是痛苦的。但即便如此,它仍然可能比在你自己的 gem 中重新实现和维护依赖关系更痛苦。
我建议考虑使您的 gem与最新版本的依赖项最兼容,并根据您对用户群的了解,从长远来看,弃用对旧依赖项的支持。所有相关人员可能有充分的理由摆脱旧的依赖关系。