在gem中放置/访问配置文件的位置?

web*_*ren 39 ruby gem yaml config

我正在编写我的第一个gem,我希望用户通过config.yml文件检索和设置特定选项.

这个文件应放在我的gem文件结构中的哪个位置以及有人在安装我的gem时如何修改文件?我猜他们可以在安装gem时传递特定的选项,这些选项可以映射到config.yml文件,但这怎么可能?

另外,是通过YAML.load_file检索文件的最佳方法吗?

我看过Ryan关于通过Bundler创建宝石的轨道广播,但他没有涉及这个话题.

小智 52

我有点迟到了,但我将留下一个示例实现,我将如何处理这个,以供将来参考.

如上所述,您通常希望允许通过文件和哈希进行配置.包含两种方式非常容易和轻松,所以你应该这样做.

在大多数情况下,这样的东西对我有用:

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
Run Code Online (Sandbox Code Playgroud)

一个额外的最佳实践是为所有配置键设置默认值(如上例所示).这样,您就可以让用户最终自由地配置您的库.

  • 阅读这个答案我感觉更聪明. (7认同)

小智 5

如果您的gem包含一个可由用户以交互方式运行的命令,则最好在第一次运行时提示任何必要的详细信息.保存配置的好地方是在用户的主目录中作为点文件.

如果你的gem纯粹在其他代码中用作库,那么应该允许配置作为哈希或类似的传递.