宝石打算支持宝石a
或b
作为功能的替代品。
在代码中,如果我回到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
时,如何明确要求b
和b
模仿(或模拟)场景?
3)另外,如何指定a
或b
是gem的先决条件。
感谢
答案 0 :(得分:2)
不要在您的依赖项中包含a
gem,但无论如何都要require
。如果失败,它将引发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
即使安装了YourGem::Backend::A
,也会使用b
。
在测试之前,请确保安装了a
和b
宝石,require
测试代码中的后端,使用一个后端运行测试,然后运行测试再次与另一个后端。
答案 1 :(得分:0)
我刚才有同样的问题。我的解决方案是认为开发人员应该指定这种行为。我不会在gem上指定它,但是在wiki上。我建议您清楚地记录开发人员需要定义其中一个依赖项。
为了使它更好,您可以检查gem的初始化,查找依赖项,如果找不到任何内容,只需引发运行时异常,或者如果您愿意,可以查看自己的异常。 =)