2011-06-03 121 views
36

我正在寫我的第一個寶石,我想要特定的選項來檢索和設置由用戶通過config.yml文件。在gem中放置/訪問配置文件的位置?

這個文件應該放在我的gem文件結構中,以及在安裝我的gem時如何修改文件?我猜測他們可以在安裝gem時通過特定的選項,並且這些選項可以映射到config.yml文件,但這怎麼可能?

此外,是通過YAML.load_file檢索文件的最佳方法?

我看過Ryan的軌道廣播通過Bundler創建一個gem,但他沒有涉及到這個話題。

回答

49

我在這一點上跳得有點晚,但我會留下一個示例實現,我通常如何處理這個問題,以供將來參考。

如前所述,您通常會希望允許通過文件和哈希進行配置。包含兩種方式都很簡單,所以你應該這樣做。

像這樣的事情對我的作品在大多數情況下:

require 'yaml' 

module MyGem 
    # Configuration defaults 
    @config = { 
       :log_level => "verbose", 
       :min => 0, 
       :max => 99 
      } 

    @valid_config_keys = @config.keys 

    # Configure through hash 
    def self.configure(opts = {}) 
    opts.each {|k,v| @config[k.to_sym] = v if @valid_config_keys.include? k.to_sym} 
    end 

    # Configure through yaml file 
    def self.configure_with(path_to_yaml_file) 
    begin 
     config = YAML::load(IO.read(path_to_yaml_file)) 
    rescue Errno::ENOENT 
     log(:warning, "YAML configuration file couldn't be found. Using defaults."); return 
    rescue Psych::SyntaxError 
     log(:warning, "YAML configuration file contains invalid syntax. Using defaults."); return 
    end 

    configure(config) 
    end 

    def self.config 
    @config 
    end 
end 

另外一個最好的做法是對所有配置項的默認值(如上面的例子)。這樣,您可以爲用戶提供終極自由,讓他們可以配置自己的庫。

+7

我覺得閱讀這個答案更聰明。 – 2012-10-21 04:36:17

+0

我一直爲{hash =>'var「}得到一個'undefined method'to_sym':當我使用類似這樣的東西時,哈希(NoMethodError),它抱怨self.configure()方法 – Pred 2015-05-12 20:58:23

+0

我改變了k.to_sym到:k.to_sym,並且錯誤不再發生,但它甚至不嘗試讀取我的配置文件。 – Pred 2015-05-12 21:13:29

2

作爲一個寶石,你需要讓人們與他們交流他們想要的東西。你不能假設任何類型的應用程序結構。而是公開一個允許開發人員傳入選項散列的API,或者一個可以讀取和解析的自己YAML文件的路徑。

但試圖從寶石建立文件命名約定可能不是你想要的。

+0

通過捆紮機創建的創業板指定的結構已經建立的爲您服務。我正試圖找到最好的地方來將我的配置文件粘貼在這個結構中(在我自己的寶石中)。有許多寶石允許用戶指定選項。比如說你正在寫一些與RESTful服務進行通信的gem。那麼,我們需要一個URL來連接到服務。我不想在連接代碼中對網址進行硬編碼,而是將其放置在配置文件中,並從該文件的代碼中檢索它。 – webren 2011-06-03 22:36:18

+0

另外,假設您的gem允許用戶連接到任何RESTful服務,但您的用戶需要知道該URL。您如何獲取用戶的URL並將其放入代碼的服務連接邏輯中? (這反映了問題2)。 – webren 2011-06-03 22:37:47

+0

你想從你的寶石中加載包裝在你的寶石中的yaml文件?或者你想從消費寶石的代碼中自動加載yaml文件? – 2011-06-03 23:18:10

4

如果您的gem包含可以由用戶交互式運行的命令,那麼最好在第一次運行時提示任何必要的細節。保存配置的好地方是用戶的主目錄中的一個點文件。

如果你的寶石純粹是作爲庫的其他代碼使用,那麼配置應該被允許作爲散列或類似的東西傳入。

+0

我的情況是後者(我的代碼將被用作庫)。我將如何去讓用戶通過哈希提交選項? – webren 2011-06-06 18:12:34

相關問題