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

宝石打算支持宝石a或b作为功能的替代品.

在代码中我用定义的方法检查?(A)如果我回到b那很好.

但作为宝石开发者如何指定这些依赖关系?

1)我把什么放在Gemfile中.

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

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

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

3)另外如何指定a或b是gem的先决条件.

谢谢

最佳答案 不要在依赖项中包含gem,但无论如何都需要它.如果失败,则会引发LoadError,您可以从中进行救援.

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

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

>为后端定义接口,并允许轻松插入自定义实现.

module YourGem
  class << self
    attr_accessor :backend

    def do_something_awesome
      backend.do_something_awesome
    end
  end
end

>实现a和b后端.

# 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

>设置您要使用的那个.

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.
>在测试之前,确保安装了a和b gems,在测试代码中需要两个后端,用一个后端运行测试,然后再用另一个后端运行测试.

点赞