在ruby Gemfile中指定gem的可选依赖项的正确方法

时间:2012-11-13 09:48:15

标签: ruby testing rubygems bundler gemfile

宝石打算支持宝石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)当我在测试中回到a时,如何明确要求bb模仿(或模拟)场景?

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

感谢

2 个答案:

答案 0 :(得分:2)

不要在您的依赖项中包含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
    

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

  4. 在测试之前,请确保安装了ab宝石,require测试代码中的后端,使用一个后端运行测试,然后运行测试再次与另一个后端。

答案 1 :(得分:0)

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

为了使它更好,您可以检查gem的初始化,查找依赖项,如果找不到任何内容,只需引发运行时异常,或者如果您愿意,可以查看自己的异常。 =)