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

时间:2011-06-03 22:05:18

标签: ruby gem yaml config

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

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

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

我看过Ryan关于通过Bundler制作宝石的铁路广播,但他没有涉及这个话题。

4 个答案:

答案 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

https://robots.thoughtbot.com/mygem-configure-block

相关问题