Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby Gemfile中指定gem可选依赖项的正确方法_Ruby_Testing_Rubygems_Bundler_Gemfile - Fatal编程技术网

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

在ruby Gemfile中指定gem可选依赖项的正确方法,ruby,testing,rubygems,bundler,gemfile,Ruby,Testing,Rubygems,Bundler,Gemfile,gem打算支持gemsa或b作为功能的替代方案 在代码中,我使用定义?(A)检查,如果我返回到b就可以了 但是作为一个gem开发人员,如何指定这些依赖关系呢 1) 我应该在档案里放什么 group :development, :test do gem 'a', :require => false gem 'b', :require => false end 这允许Bundle.require(:test)不自动要求a、b 2) 当我们在测试中退回到b时,如何明确要求a和b分

gem打算支持gems
a
b
作为功能的替代方案

在代码中,我使用
定义?(A)
检查,如果我返回到
b
就可以了

但是作为一个gem开发人员,如何指定这些依赖关系呢

1) 我应该在档案里放什么

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上指定它,而是在wiki上指定。我建议您清楚地记录开发人员需要定义一个依赖项


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

不要在依赖项中包含
a
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
    
  • 设置要使用的一个

    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

  • 测试前,确保安装了
    a
    b
    gems,
    require
    测试代码中的两个后端,使用一个后端运行测试,然后使用另一个后端再次运行测试


  • thx,你对3)有看法,也许1):你没有提到这些宝石,对吗?我不明白你的评论=/这对于实现代码来说是可以的,但是在测试中,模拟抛出这个LoadError的最佳实践是什么?@viktortron,我已经更新了我的答案。这是一个相当不寻常的设置,但这就是我测试它的方式。
    begin
      require 'your_gem/backends/a'
      Gem.backend = YourGem::Backends::A
    rescue LoadError
      require 'your_gem/backends/b'
      Gem.backend = YourGem::Backends::B
    end