我有一个独立的ruby脚本,打算从命令行运行。
当前,我有一个部分来定义诸如文件路径之类的内容。
key_path = "C:\\OpenSSL-Win64\\keys\\"
consumer_file = "henrb028.consumer"
key_file = "henrb028.key"
我很乐意将所有内容都从.rb文件中提取出来,并放入一些外部配置文件中。理想情况下,它应尽可能轻巧。例如,只需将其复制粘贴到另一个ruby文件中,然后在运行时将其填充。
我已经尝试过require
和include
并遇到各种错误。如果不采用YAML之类的方法,什么是简单而强大的方法?
有几种实现您所描述内容的标准方法。
每个环境都存储一个特定的参数。然后,用户可以控制是否要更改部分或全部参数。
一个例子:
key_file = ENV['KEY_FILE'] || "henrb028.key"
然后,每个用户和系统管理员中的一个或两个都可以在需要时控制和更改它。如何确定配置文件的文件名有所不同。
一个(粗暴!)示例:
假设/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在其评论中建议的那样)是一个功能强大且用途广泛的库,用于处理命令行选项。
一个简单的例子(不使用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
我认为这些是最典型的方式,尽管还有其他方式!