仅在某些方法调用时需要依赖关系

时间:2012-03-01 18:54:20

标签: ruby gem

我有一个打包为gem的函数库。其中一个函数需要使用第三方gem,它本身有很长的依赖项列表。

有没有办法可以设置我的gem,以便用户可以安装它并在gem中使用那些没有第三方依赖的函数而没有运行时抱怨?

我希望在调用具有依赖项的方法时引发异常,但是用户应该能够使用其他函数而不会出现运行时错误。

这可能吗?

2 个答案:

答案 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中实现可选的依赖项。