2012-03-01 12 views
1

私は宝石としてパッケージ化された関数ライブラリを持っています。これらの関数の1つは、それ自体が長い依存関係のリストを持つサードパーティ製の宝石の使用を必要とします。特定のメソッド呼び出しでのみ依存関係が必要です

実行時に不満を感じることなくサードパーティの依存関係を持たない宝石の中で、ユーザがインストールしてそれらの機能を使用できるように私の宝石を設定する方法はありますか?

依存関係のあるメソッドが呼び出されたときに例外を発生させたいが、ユーザーは実行時エラーなしで他の関数を使用できるはずです。

これは可能ですか?

答えて

1

宝石に依存するかどうかに関わらず、機能をモジュール(多分モジュールからファイルへ)に分割することができます。 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など

良い例では、3の1つのHTTPを設定することができますhttps://github.com/rubiii/httpiですアダプター。アダプター自体にはルビ内の個々の依存関係が必要です。

問題は、エンドユーザーが何らかの形で第三者の宝石をインストールする方法を知る必要があることです。現在のところ、ruby gemspec内でオプションの依存関係を実装することはできません。

関連する問題