我正在寫我的第一個寶石,我想要特定的選項來檢索和設置由用戶通過config.yml文件。在gem中放置/訪問配置文件的位置?
這個文件應該放在我的gem文件結構中,以及在安裝我的gem時如何修改文件?我猜測他們可以在安裝gem時通過特定的選項,並且這些選項可以映射到config.yml文件,但這怎麼可能?
此外,是通過YAML.load_file檢索文件的最佳方法?
我看過Ryan的軌道廣播通過Bundler創建一個gem,但他沒有涉及到這個話題。
我正在寫我的第一個寶石,我想要特定的選項來檢索和設置由用戶通過config.yml文件。在gem中放置/訪問配置文件的位置?
這個文件應該放在我的gem文件結構中,以及在安裝我的gem時如何修改文件?我猜測他們可以在安裝gem時通過特定的選項,並且這些選項可以映射到config.yml文件,但這怎麼可能?
此外,是通過YAML.load_file檢索文件的最佳方法?
我看過Ryan的軌道廣播通過Bundler創建一個gem,但他沒有涉及到這個話題。
我在這一點上跳得有點晚,但我會留下一個示例實現,我通常如何處理這個問題,以供將來參考。
如前所述,您通常會希望允許通過文件和哈希進行配置。包含兩種方式都很簡單,所以你應該這樣做。
像這樣的事情對我的作品在大多數情況下:
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
另外一個最好的做法是對所有配置項的默認值(如上面的例子)。這樣,您可以爲用戶提供終極自由,讓他們可以配置自己的庫。
作爲一個寶石,你需要讓人們與他們交流他們想要的東西。你不能假設任何類型的應用程序結構。而是公開一個允許開發人員傳入選項散列的API,或者一個可以讀取和解析的自己YAML文件的路徑。
但試圖從寶石建立文件命名約定可能不是你想要的。
通過捆紮機創建的創業板指定的結構已經建立的爲您服務。我正試圖找到最好的地方來將我的配置文件粘貼在這個結構中(在我自己的寶石中)。有許多寶石允許用戶指定選項。比如說你正在寫一些與RESTful服務進行通信的gem。那麼,我們需要一個URL來連接到服務。我不想在連接代碼中對網址進行硬編碼,而是將其放置在配置文件中,並從該文件的代碼中檢索它。 – webren 2011-06-03 22:36:18
另外,假設您的gem允許用戶連接到任何RESTful服務,但您的用戶需要知道該URL。您如何獲取用戶的URL並將其放入代碼的服務連接邏輯中? (這反映了問題2)。 – webren 2011-06-03 22:37:47
你想從你的寶石中加載包裝在你的寶石中的yaml文件?或者你想從消費寶石的代碼中自動加載yaml文件? – 2011-06-03 23:18:10
如果您的gem包含可以由用戶交互式運行的命令,那麼最好在第一次運行時提示任何必要的細節。保存配置的好地方是用戶的主目錄中的一個點文件。
如果你的寶石純粹是作爲庫的其他代碼使用,那麼配置應該被允許作爲散列或類似的東西傳入。
我的情況是後者(我的代碼將被用作庫)。我將如何去讓用戶通過哈希提交選項? – webren 2011-06-06 18:12:34
不使用配置文件另一種模式:
YourGem.configure do |config|
config.api_key = 'your_key_here'
end
我覺得閱讀這個答案更聰明。 – 2012-10-21 04:36:17
我一直爲{hash =>'var「}得到一個'undefined method'to_sym':當我使用類似這樣的東西時,哈希(NoMethodError),它抱怨self.configure()方法 – Pred 2015-05-12 20:58:23
我改變了k.to_sym到:k.to_sym,並且錯誤不再發生,但它甚至不嘗試讀取我的配置文件。 – Pred 2015-05-12 21:13:29