【问题标题】:proper way to specify optional dependencies of a gem in ruby Gemfile在 ruby​​ Gemfile 中指定 gem 的可选依赖项的正确方法
【发布时间】:2012-11-13 09:48:14
【问题描述】:

gem 打算支持 gems ab 作为功能的替代方案。

在代码中我检查defined?(A),如果我回退到b,那很好。

但是作为gem开发者如何指定这些依赖呢?

1) 我在 Gemfile 中放了什么。

group :development, :test do
  gem 'a', :require => false
  gem 'b', :require => false
end

这允许Bundle.require(:test) 不自动要求 a,b?

2) 当我们在测试中回退到b 时,如何分别明确要求ab 来模拟(或模拟)场景?

3) 另外我如何指定 ab 是 gem 的先决条件。

谢谢

【问题讨论】:

    标签: ruby testing rubygems bundler gemfile


    【解决方案1】:

    不要在您的依赖项中包含a gem,但无论如何都要包含require。如果失败,它将引发LoadError,您可以从中解救。

    begin
      require 'a'
    rescue LoadError
      # The 'a' gem is not installed
      require 'b'
    end
    

    我相信这是使用和测试此设置的最佳方式:

    1. 为您的后端定义一个接口并允许轻松插入自定义实现。

      module YourGem
        class << self
          attr_accessor :backend
      
          def do_something_awesome
            backend.do_something_awesome
          end
        end
      end
      
    2. 实现ab 后端。

      # your_gem/backends/a.rb
      require 'a'
      
      module YourGem::Backends::A
        def self.do_something_awesome
          # Do it
        end
      end
      
      # your_gem/backends/b.rb
      require 'b'
      
      module YourGem::Backends::B
        def self.do_something_awesome
          # Do it
        end
      end
      
    3. 设置你要使用的那个。

      begin
        require 'your_gem/backends/a'
        Gem.backend = YourGem::Backends::A
      rescue LoadError
        require 'your_gem/backends/b'
        Gem.backend = YourGem::Backends::B
      end
      

      即使安装了b,这也会使用YourGem::Backend::A

    4. 在测试之前,确保 ab gems 都已安装,require 两个后端都在测试代码中,用一个后端运行测试,然后用另一个后端再次运行测试。

    【讨论】:

    • 这对于实现代码来说是可以的,但是在测试中模拟需要抛出这个 LoadError 的最佳实践是什么?
    • @viktortron,我已经更新了我的答案。这是一个相当不寻常的设置,但我就是这样测试它的。
    【解决方案2】:

    不久前我也收到了同样的问题。我的解决方案是认为开发人员应该指定这种行为。我不会在 gem 上指定它,而是在 wiki 上指定它。我建议您清楚地记录开发人员需要定义其中一个依赖项。

    为了让它更好,你可以检查 gem 的初始化,寻找依赖关系,如果找不到,只需引发运行时异常,或者如果你愿意,你自己的异常。 =)

    【讨论】:

    • thx,您对 3) 有看法,那么,也许 1):您没有提到这些宝石对吗?对 2) 有什么想法吗?
    • 我不明白你的评论。 =/
    猜你喜欢
    • 2013-04-14
    • 2023-04-04
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    相关资源
    最近更新 更多