2011-06-03 71 views
36

我正在写我的第一个宝石,我想要特定的选项来检索和设置由用户通过config.yml文件。在gem中放置/访问配置文件的位置?

这个文件应该放在我的gem文件结构中,以及在安装我的gem时如何修改文件?我猜测他们可以在安装gem时通过特定的选项,并且这些选项可以映射到config.yml文件,但这怎么可能?

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

我看过Ryan的轨道广播通过Bundler创建一个gem,但他没有涉及到这个话题。

回答

49

我在这一点上跳得有点晚,但我会留下一个示例实现,我通常如何处理这个问题,以供将来参考。

如前所述,您通常会希望允许通过文件和哈希进行配置。包含两种方式都很简单,所以你应该这样做。

像这样的事情对我的作品在大多数情况下:

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 

另外一个最好的做法是对所有配置项的默认值(如上面的例子)。这样,您可以为用户提供终极自由,让他们可以配置自己的库。

+7

我觉得阅读这个答案更聪明。 – 2012-10-21 04:36:17

+0

我一直为{hash =>'var“}得到一个'undefined method'to_sym':当我使用类似这样的东西时,哈希(NoMethodError),它抱怨self.configure()方法 – Pred 2015-05-12 20:58:23

+0

我改变了k.to_sym到:k.to_sym,并且错误不再发生,但它甚至不尝试读取我的配置文件。 – Pred 2015-05-12 21:13:29

2

作为一个宝石,你需要让人们与他们交流他们想要的东西。你不能假设任何类型的应用程序结构。而是公开一个允许开发人员传入选项散列的API,或者一个可以读取和解析的自己YAML文件的路径。

但试图从宝石建立文件命名约定可能不是你想要的。

+0

通过捆扎机创建的创业板指定的结构已经建立的为您服务。我正试图找到最好的地方来将我的配置文件粘贴在这个结构中(在我自己的宝石中)。有许多宝石允许用户指定选项。比如说你正在写一些与RESTful服务进行通信的gem。那么,我们需要一个URL来连接到服务。我不想在连接代码中对网址进行硬编码,而是将其放置在配置文件中,并从该文件的代码中检索它。 – webren 2011-06-03 22:36:18

+0

另外,假设您的gem允许用户连接到任何RESTful服务,但您的用户需要知道该URL。您如何获取用户的URL并将其放入代码的服务连接逻辑中? (这反映了问题2)。 – webren 2011-06-03 22:37:47

+0

你想从你的宝石中加载包装在你的宝石中的yaml文件?或者你想从消费宝石的代码中自动加载yaml文件? – 2011-06-03 23:18:10

4

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

如果你的宝石纯粹是作为库的其他代码使用,那么配置应该被允许作为散列或类似的东西传入。

+0

我的情况是后者(我的代码将被用作库)。我将如何去让用户通过哈希提交选项? – webren 2011-06-06 18:12:34

相关问题