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

Ruby 在gem中放置/访问配置文件的位置?,ruby,gem,yaml,config,Ruby,Gem,Yaml,Config,我正在编写我的第一个gem,我希望用户通过config.yml文件检索和设置特定的选项 这个文件应该放在我的gem文件结构中的什么位置?在安装我的gem时,有人如何修改这个文件?我猜他们可以在安装gem时传入特定的选项,这些选项可以映射到config.yml文件,但是这怎么可能呢 另外,通过YAML.load\u文件检索文件的最佳方法是什么 我看过Ryan关于通过Bundler创建gem的Railcast,但他没有涉及这个主题。作为一个gem,你需要允许人们以他们想要的方式与之交互。你不能假设任

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

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

另外,通过YAML.load\u文件检索文件的最佳方法是什么


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

作为一个gem,你需要允许人们以他们想要的方式与之交互。你不能假设任何类型的应用程序结构。相反,公开一个API,允许开发人员传入选项的散列,或者传递到您可以读取和解析的他们自己的YAML文件的路径


但是尝试从gem建立文件命名约定可能不是您想要的。

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


如果您的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

添加的最佳实践是为所有配置键设置默认值(如上面的示例所示)。这样,用户就可以自由配置库了。

不使用配置文件的另一种模式:

YourGem.configure do |config|
  config.api_key = 'your_key_here'
end

通过Bundler创建的gem已经为您建立了指定的结构。我正试图找到在这个结构中粘贴配置文件的最佳位置(在我自己的gem中)。有很多宝石可以让用户指定选项。例如,假设您正在编写一个与RESTful服务通信的gem。嗯,我们需要一个URL来连接到服务。我不想在我的连接代码中硬编码URL,而是想把它放在一个配置文件中,并在我的代码中从该文件中检索它。另外,假设您的gem允许用户连接到任何RESTful服务,但您的用户需要知道URL。如何获取用户的URL并将其放入代码的服务连接逻辑中?(这反映了问题2)。是否要从gem加载打包在gem中的yaml文件?或者您想从使用gem的代码自动加载yaml文件?对前一个问题是。如何在gem中加载YAML配置文件?用户是否有可能访问同一个文件并修改其属性?允许用户提供自己的YAML文件将是一个很好的选择。我假设在我的gem文档中必须指定一个特定的位置,我只需使用YAML.load_文件来加载配置内容?我的情况是后者(我的代码将用作库)。我该如何让用户通过散列提交选项呢?我一直在为{hash=>'var'}:hash(NoMethodError当我使用这样的东西时,它总是得到一个
未定义的方法'to_sym':散列(NoMethodError
。它抱怨self.configure()方法。我将k.to_sym更改为:k.to_sym,错误不再发生,但它甚至没有尝试读取我的配置文件。