5

gem は、gem をサポートすること、aまたはb機能の代替として使用することを意図しています。

コードではdefined?(A)、フォールバックするかどうかを確認しbます。

しかし、gem 開発者として、これらの依存関係を指定するにはどうすればよいでしょうか?

1) Gemfile には何を入れますか。

group :development, :test do
  gem 'a', :require => false
  gem 'b', :require => false
end

これによりBundle.require(:test)、a,b? を自動要求しないようにすることができます。

2)テストでフォールバックするときに、シナリオを模倣(またはモック)することを明示的に要求aし、個別に行うにはどうすればよいですか?bb

3) また、gem の前提条件であるaorを指定するにはどうすればよいですか。b

ありがとう

4

2 に答える 2

4

a依存関係に宝石を含めないでくださいrequire。それが失敗した場合、 が発生し、そこLoadErrorから救出できます。

begin
  require 'a'
rescue LoadError
  # The 'a' gem is not installed
  require 'b'
end

これは、このセットアップを使用してテストするための最良の方法だと思います。

  1. バックエンドのインターフェースを定義し、カスタム実装を簡単にプラグインできるようにします。

    module YourGem
      class << self
        attr_accessor :backend
    
        def do_something_awesome
          backend.do_something_awesome
        end
      end
    end
    
  2. aおよびbバックエンドを実装します。

    # your_gem/backends/a.rb
    require 'a'
    
    module YourGem::Backends::A
      def self.do_something_awesome
        # Do it
      end
    end
    
    # your_gem/backends/b.rb
    require 'b'
    
    module YourGem::Backends::B
      def self.do_something_awesome
        # Do it
      end
    end
    
  3. 使用したいものを設定してください。

    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されます。

  4. テストの前に、abgems の両方がインストールされていることを確認し、require両方のバックエンドがテスト コードに含まれていることを確認し、1 つのバックエンドでテストを実行してから、もう 1 つのバックエンドでテストを再度実行します。

于 2012-11-13T15:29:18.937 に答える
0

少し前に同じ質問がありました。私の解決策は、開発者がこの動作を指定する必要があると考えることでした。私はそれを宝石ではなく、ウィキで指定します。開発者が依存関係の1つを定義する必要があることを明確に文書化することをお勧めします。

これを改善するには、gemの初期化をチェックし、依存関係を探します。依存関係が見つからない場合は、ランタイム例外を発生させるか、必要に応じて独自の例外を発生させます。=)

于 2012-11-13T13:50:40.873 に答える