我正在写我的第一个宝石,我想要特定的选项来检索和设置由用户通过config.yml文件。在gem中放置/访问配置文件的位置?
这个文件应该放在我的gem文件结构中,以及在安装我的gem时如何修改文件?我猜测他们可以在安装gem时通过特定的选项,并且这些选项可以映射到config.yml文件,但这怎么可能?
此外,是通过YAML.load_file检索文件的最佳方法?
我看过Ryan的轨道广播通过Bundler创建一个gem,但他没有涉及到这个话题。
我正在写我的第一个宝石,我想要特定的选项来检索和设置由用户通过config.yml文件。在gem中放置/访问配置文件的位置?
这个文件应该放在我的gem文件结构中,以及在安装我的gem时如何修改文件?我猜测他们可以在安装gem时通过特定的选项,并且这些选项可以映射到config.yml文件,但这怎么可能?
此外,是通过YAML.load_file检索文件的最佳方法?
我看过Ryan的轨道广播通过Bundler创建一个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
另外一个最好的做法是对所有配置项的默认值(如上面的例子)。这样,您可以为用户提供终极自由,让他们可以配置自己的库。
作为一个宝石,你需要让人们与他们交流他们想要的东西。你不能假设任何类型的应用程序结构。而是公开一个允许开发人员传入选项散列的API,或者一个可以读取和解析的自己YAML文件的路径。
但试图从宝石建立文件命名约定可能不是你想要的。
通过捆扎机创建的创业板指定的结构已经建立的为您服务。我正试图找到最好的地方来将我的配置文件粘贴在这个结构中(在我自己的宝石中)。有许多宝石允许用户指定选项。比如说你正在写一些与RESTful服务进行通信的gem。那么,我们需要一个URL来连接到服务。我不想在连接代码中对网址进行硬编码,而是将其放置在配置文件中,并从该文件的代码中检索它。 – webren 2011-06-03 22:36:18
另外,假设您的gem允许用户连接到任何RESTful服务,但您的用户需要知道该URL。您如何获取用户的URL并将其放入代码的服务连接逻辑中? (这反映了问题2)。 – webren 2011-06-03 22:37:47
你想从你的宝石中加载包装在你的宝石中的yaml文件?或者你想从消费宝石的代码中自动加载yaml文件? – 2011-06-03 23:18:10
如果您的gem包含可以由用户交互式运行的命令,那么最好在第一次运行时提示任何必要的细节。保存配置的好地方是用户的主目录中的一个点文件。
如果你的宝石纯粹是作为库的其他代码使用,那么配置应该被允许作为散列或类似的东西传入。
我的情况是后者(我的代码将被用作库)。我将如何去让用户通过哈希提交选项? – webren 2011-06-06 18:12:34
不使用配置文件另一种模式:
YourGem.configure do |config|
config.api_key = 'your_key_here'
end
我觉得阅读这个答案更聪明。 – 2012-10-21 04:36:17
我一直为{hash =>'var“}得到一个'undefined method'to_sym':当我使用类似这样的东西时,哈希(NoMethodError),它抱怨self.configure()方法 – Pred 2015-05-12 20:58:23
我改变了k.to_sym到:k.to_sym,并且错误不再发生,但它甚至不尝试读取我的配置文件。 – Pred 2015-05-12 21:13:29