我有一个打包为gem的函数库。其中一个函数需要使用第三方gem,它本身有很长的依赖项列表。
有没有办法可以设置我的gem,以便用户可以安装它并在gem中使用那些没有第三方依赖的函数而没有运行时抱怨?
我希望在调用具有依赖项的方法时引发异常,但是用户应该能够使用其他函数而不会出现运行时错误。
这可能吗?
答案 0 :(得分:1)
您可以将功能拆分为依赖于或不依赖于gem的模块(也可以是模块到文件)。包括GemDependent
模块试图要求你的宝石,如果没有,然后重新定义所有宝石相关的函数,以引发异常。
module YourFunctions
module GemDependent
def self.included(klass)
require "yourgem"
rescue LoadError
instance_methods.each do |m|
define_method(m) { raise "you need yourgem to run #{m}" }
end
end
def gem_dependent_function
end
end
include GemDependent
def no_dependent_function
end
end
include YourFunctions
gem_dependent_function
# "you need yourgem to run gem_dependent_function"
答案 1 :(得分:0)
如果您想知道如何执行此操作,请查看http,json,yaml等的各种包装器库。
一个很好的例子是https://github.com/rubiii/httpi,您可以在其中配置3个http适配器之一。适配器本身需要ruby中的各个依赖项。
问题是,最终用户需要以某种方式知道如何安装第三方宝石。目前无法在ruby gemspecs中实现可选的依赖项。