2

我正在编写一个具有多个 gem 依赖项的 gem,其中一个依赖于在较新版本中破坏向后兼容性的 gem。这让我开始思考——我不希望我正在构建的 gem 成为让人们难以更新他们的应用程序的“那个 gem”。我也不想强迫使用我的 gem 的人必须在他们的应用程序的其余部分使用它所依赖的 gem 的特定版本。

一方面,我可以重写这些依赖项中的所有代码,将它们与我的 gem 捆绑在一起,然后一起删除依赖项,但这似乎有点乏味。有什么方法可以让我简单地将 gem 依赖项直接包含在我的 gem 中,然后将它们包装在一个模块中,这样我的打包版本就不会与应用程序其余部分使用的版本冲突?

4

2 回答 2

1

我认为通过现有的 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与最新版本的依赖项兼容,并根据您对用户群的了解,从长远来看,弃用对旧依赖项的支持。所有相关人员可能有充分的理由摆脱旧的依赖关系。

于 2013-07-09T13:19:38.843 回答
0

假设您使用的是 bundler,您可以在 Gemfile 中为依赖项指定版本,如下所示:

gem "my_dependency", "0.6.1"

还有很多其他选项,例如“大于 X 的版本”等。阅读捆绑器文档以获取更多信息。

于 2013-07-09T12:28:21.317 回答