2012-03-01 71 views
1

我有一個打包爲gem的函數庫。其中一個功能需要使用第三方gem,它本身有很長的依賴關係。僅在某些方法調用時才需要依賴關係

有沒有一種方法可以設置我的gem,以便用戶可以安裝它並在沒有運行時抱怨的情況下在沒有第三方依賴項的gem中使用這些函數?

我想調用具有依賴項的方法時引發異常,但用戶應該能夠使用其他函數而不會出現運行時錯誤。

這可能嗎?

回答

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" 
0
,如果你想知道如何做到這一點

,看看對於HTTP,JSON,YAML等

各種包裝材料庫一個很好的例子是https://github.com/rubiii/httpi在這裏你可以配置3一個HTTP適配器。適配器本身需要ruby中的各個依賴項。

問題是,最終用戶需要以某種方式知道如何安裝第三方寶石。目前不可能在ruby gemspecs中實現可選的依賴關係。