我正在编写我的第一个gem,我希望用户通过config.yml文件检索和设置特定选项。
这个文件放在我的gem文件结构中应该放在哪里?有人在安装我的gem时如何修改文件?我猜他们可以在安装gem时传递特定的选项,这些选项可以映射到config.yml文件,但这怎么可能呢?
此外,是通过YAML.load_file检索文件的最佳方法吗?
我看过Ryan关于通过Bundler制作宝石的铁路广播,但他没有涉及这个话题。
答案 0 :(得分:50)
我迟到了,但我会留下一个示例实现,我将如何处理这个问题,以供将来参考。
如上所述,您通常希望允许通过文件和哈希进行配置。包含两种方式非常容易和轻松,所以你应该这样做。
在大多数情况下,这样的事情对我有用:
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
添加的最佳做法是为所有配置键设置默认值(如上例所示)。这样,您就可以为用户提供配置库的最终自由。
答案 1 :(得分:5)
如果您的gem包含一个可由用户以交互方式运行的命令,则最好在第一次运行时提示任何必要的详细信息。保存配置的好地方是在用户的主目录中作为点文件。
如果你的gem纯粹在其他代码中用作库,那么应该允许配置作为哈希等传递。
答案 2 :(得分:2)
作为一个宝石,你需要让人们以他们想要的方式与它交互。你不能假设任何类型的应用程序结构。而是公开一个API,允许开发人员传入选项的散列,或者传递给你自己的YAML文件的路径,你可以读取和解析它。
但是尝试从gem建立文件命名约定可能不是你想要的。
答案 3 :(得分:1)
不使用配置文件的另一种模式:
YourGem.configure do |config|
config.api_key = 'your_key_here'
end