独立Ruby脚本的外部配置

问题描述 投票:0回答:1

我有一个独立的ruby脚本,打算从命令行运行。

当前,我有一个部分来定义诸如文件路径之类的内容。

    key_path = "C:\\OpenSSL-Win64\\keys\\"
    consumer_file = "henrb028.consumer"
    key_file = "henrb028.key"

我很乐意将所有内容都从.rb文件中提取出来,并放入一些外部配置文件中。理想情况下,它应尽可能轻巧。例如,只需将其复制粘贴到另一个ruby文件中,然后在运行时将其填充。

我已经尝试过requireinclude并遇到各种错误。如果不采用YAML之类的方法,什么是简单而强大的方法?

ruby configuration
1个回答
0
投票

有几种实现您所描述内容的标准方法。

从环境变量中读取

每个环境都存储一个特定的参数。然后,用户可以控制是否要更改部分或全部参数。

  • Pros:对于开发人员和用户而言,只要很少更改参数,都是标准且简便的方法。默认参数可以轻松地在同一环境(例如同一帐户甚至整个平台范围)以及其他程序中共享。
  • 缺点:有些模糊。例如,如果用户使用该工具的工作记录在文件中,则其他人(或什至以后是他/她本人)也无法从日志文件中分辨出所使用的确切参数集。或者,如果用户想频繁更改参数,则很麻烦。

一个例子

 key_file = ENV['KEY_FILE'] || "henrb028.key"

读取配置文件

然后,每个用户和系统管理员中的一个或两个都可以在需要时控制和更改它。如何确定配置文件的文件名有所不同。

  • Pros:适用于存储大量参数。
  • 缺点:有些模糊。例如,如果用户使用该工具的工作记录在文件中,则其他人(或什至以后是他/她自己的用户)也无法告知所使用的参数的确切集合。如果用户想频繁更改参数,则很尴尬。

一个(粗暴!)示例

假设/etc/OUR_CONFIG.txt如下,

 CONSUMER_FILE: henrb028.consumer
 KEY_FILE: henrb028.key

然后,像阅读它们一样,

 opts = { 'KEY_FILE' => 'default.key' }
 IO.readlines("/etc/OUR_CONFIG.txt").each do |ec|
   a = ec.strip.split(/\s*:\s*/)
   opts[a[0]] = a[1]
 end
 p opts

使用命令行选项指定

如果在运行时未指定某些(或全部)选项,则应退回到default值。 OptionParser(如@tadaman在其评论中建议的那样)是一个功能强大且用途广泛的库,用于处理命令行选项。

  • Pros:对用户来说是标准且方便的方式,尤其是对于运行时的快速更改。如果您看到日志文件,那么您知道用户的确切操作。
  • 缺点:默认参数不能单独与其他工具共享。为避免此问题,有几种方法可以使备用程序正常运行:
    1. 仅在主代码中硬编码默认值。
    2. 将默认值存储在环境变量中。
    3. 将默认值存储在配置文件中。开发人员必须决定如何确定配置文件的文件名(硬编码,环境变量等)。

一个简单的例子(不使用OptionParser):

opts = { 'key_file' => 'default.key' }
%w(consumer_file key_file).each do |ec|
  cands = ARGV.grep(/^--#{Regexp.quote ec}=.+/)
  opts[ec] = cands[0].split('=')[1] unless cands.empty?
end
p opts

我认为这些是最典型的方式,尽管还有其他方式!

© www.soinside.com 2019 - 2024. All rights reserved.