在ruby Gemfile中指定gem可选依赖项的正确方法
gem打算支持gems在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分
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