题
我需要在文件中存储一些简单的属性并从 Ruby 访问它们。
我非常喜欢 .properties 文件格式,它是 Java 中此类内容的标准(使用 java.util.Properties 类)...它简单、易于使用且易于阅读。
那么,是否有一个 Ruby 类可以让我轻松地从这样的文件中加载一些键值对?
我不想使用 XML,所以请不要建议 REXML(我的目的不保证“尖括号税”)。
我考虑过推出自己的解决方案......它可能大约有 5-10 行代码,但我仍然宁愿使用现有的库(如果它本质上是从文件构建的哈希)...因为这会将其减少到 1 行......
更新:它实际上是一个直接的 Ruby 应用程序,而不是 Rails,但我认为 YAML 会做得很好(它在我的脑海中,但我已经忘记了......见过但还没用过),谢谢大家!
解决方案
这是针对 Rails 应用程序还是针对 Ruby 应用程序?
实际上,您可以将属性粘贴到 yaml 文件中,然后 YAML::Load(File.open("file"))
它。
迈克·斯通的注释: 实际上,这样做会更好:
File.open("file") { |yf| YAML::load(yf) }
或者
YAML.load_file("file")
正如 ruby 文档所建议的那样,否则文件在垃圾收集之前不会关闭,但无论如何都是好的建议:-)
其他提示
另一种选择是简单地使用另一个 Ruby 文件作为配置文件。
例如,创建一个名为“选项”的文件
{
:blah => 'blee',
:foo => 'bar',
:items => ['item1', 'item2'],
:stuff => true
}
然后在你的 Ruby 代码中执行如下操作:
ops = eval(File.open('options') {|f| f.read })
puts ops[:foo]
YAML 将按照上面的描述完美地完成它。例如,在我的一个 Ruby 脚本中,我有一个 YAML 文件,如下所示:
migration:
customer: Example Customer
test: false
sources:
- name: Use the Source
engine: Foo
- name: Sourcey
engine: Bar
然后我在 Ruby 中使用它:
config = YAML.load_file(File.join(File.dirname(__FILE__), ARGV[0]))
puts config['migration']['customer']
config['sources'].each do |source|
puts source['name']
end
ini文件 - http://rubydoc.info/gems/inifile/2.0.2/frames 将支持基本的 .properties 文件以及带有 [SECTIONS] 的 .ini 文件,例如。
[SECTION]
key=value
当您的数据具有复杂的结构但可能会出现空格、制表符、行尾等繁琐的情况时,YAML 非常有用 - 如果文件不是由程序员维护,这可能会导致问题。相比之下 .properties
和 .ini
文件更宽容,如果您不需要通过 YAML 获得深层结构,则可能适合。
德文德·戈拉帕利 (Devender Gollapally) 写了一篇 班级 正是为了做到这一点:
...尽管我建议更好地使用 YAML 文件。
您可以考虑使用 YAML,而不是 .properties 样式的配置文件。YAML 在 Ruby on Rails 中用于数据库配置,并且在其他语言(Python、Java、Perl 等)中也很流行。
Ruby YAML 模块的概述如下: http://www.ruby-doc.org/core/classes/YAML.html
YAML 的主页在这里: http://yaml.org