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

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

此外,也是通过YAML检索文件的最佳方式.加载文件?

我看过Ryan关于通过Bundler创建gem的Railcast,但他没有涉及这个话题.

推荐答案

我现在讨论这个问题有点晚了,但我会留下一个我通常如何处理这个问题的示例实现,以供将来参考.

正如前面提到的,您通常希望允许通过文件和散列进行配置.这两种方法都很简单,也很简单,所以你应该这样做.

在大多数情况下,这样的方法对我都适用:

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

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

Ruby相关问答推荐

Ruby中链表大小调用的时间复杂度

使用正则表达式判断用户输入的开头是否正好有两个大括号

多线程期间的 MRI ruby​​ 内存访问特性

在 Ruby 中使用委托维护相同的类

如何在 OpenURI 中指定http 请求标头

ruby `encode': "\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)

我在哪里可以找到积极开发的 Ruby lint 工具?

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

在 RSpec-2.11 中使用隐含的 `subject` 和 `expect`

在 Ruby 中,获取第一个块返回 true 的可枚举元素的最快方法是什么?

Ruby 中 Postgres 查询的简单示例

class_eval <<-"end_eval", __FILE__, __LINE__ 在 Ruby 中是什么意思?

如何使用 Ruby 2.3 中引入的 Array#dig 和 Hash#dig?

如何在 ruby​​ net/http 中实现 cookie 支持?

如何设置方法测试中使用的私有实例变量?

为什么 Ruby 没有真正的 StringBuffer 或 StringIO?

判断字符串是否为空的Ruby方法?

如何在 Rails 3 迁移中描述枚举列?

Ruby:使用 ENV 变量(如果存在)的最简洁方法,否则使用默认值

当我们导入 csv 数据时,如何消除UTF-8 中的无效字节序列