2012-11-13 76 views
3

寶石打算支持寶石ab作爲功能的替代品。正確的方式來指定寶石中寶石的可選依賴關係寶石文件

在代碼中,我檢查defined?(A)如果我回落到b這很好。

但作爲一個寶石開發者如何指定這些依賴關係?

1)我在Gemfile中放入了什麼。

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

這允許Bundle.require(:test)不自動需要a,b?

2)在我的測試中,當我們回退到b時,如何明確要求ab分別模仿(或模擬)場景?

3)我又如何指定ab是寶石的先決條件。

謝謝

回答

0

前段時間我得到了同樣的問題。我的解決方案是認爲開發者應該指定這種行爲。我不會在寶石上指定它,而是在wiki上指定它。我建議你清楚地記錄它,開發者需要定義其中的一個依賴關係。

爲了使它更好,您可以檢查gem的初始化,查找依賴項,如果找不到任何依賴項,只需提出運行時異常,或者如果您願意,您自己的異常。 =)

+0

thx,你有一個觀點3)然後,也許1):你不提這些寶石是否正確?對2)有什麼想法? –

+0

我不明白你的評論。 =/ –

2

不要在您的依賴中包含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. 執行ab後端。

    # 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 
    

    這將使用即使安裝bYourGem::Backend::A

  4. 測試之前,要確保ab寶石安裝,require在測試代碼都後端,有一個後臺運行的測試,然後與其他後端再次運行測試。

+0

對於實現代碼,這是可以的,但是在測試中,模擬需要拋出此LoadError的最佳實踐是什麼? –

+0

@viktortron,我已經更新了我的答案。這是一個非常不尋常的設置,但這就是我要測試的方式。 –