根据YAML文件中的http://yaml.org/spec/current.html#id2509980条评论是一个表示性细节,不得在序列化/表示图(http://yaml.org/spec/current.html#representation/)中。看起来Psych正在根据规范进行解析并丢失注释,这意味着当文件包含注释时,无法解析YAML文件并将其再次序列化。在我看来这很奇怪,因为评论在这样的文件中很重要(例如配置)。
有没有人知道是否可以解析现有图书馆的评论,或者是我自己完成这一切的唯一方法?
答案 0 :(得分:1)
您可以在较低级别上迭代节点,在发出时保留注释。此外,您可以看到syck引擎是否为您提供了所需的结果。
答案 1 :(得分:1)
我们也可以做一些这样的事情,它会改变键值并保留评论。
require 'yaml'
thing = YAML.load_file('/opt/database.yml')
hostname = thing["common"]["host_name"]
appname = thing["common"]["app_name"]
motdobj = IO.readlines('/opt/database.yml')
motdobj = motdobj.map {|s| s.gsub(hostname, "mrigesh")}
motdobj = motdobj.map {|s| s.gsub(appname, "abc")}
File.open('/opt/database.yml', "w" ) do | file1 |
file1.puts motdobj
file1.close
end
答案 2 :(得分:0)
我喜欢@ josh-voigts的疯狂想法。这是一个疯狂的实现。评论几乎可以在任何地方穿插,并且有效!
require 'tempfile'
def yaml_conf_edit(fn, &block)
conf = File.open(fn) {|f| YAML.load(f.read)}
before = Tempfile.new('before')
before.write(conf.to_yaml)
before.close
yield conf
after = Tempfile.new('after')
after.write(conf.to_yaml)
after.close
`merge #{fn} #{before.path} #{after.path}`
before.unlink; after.unlink
conf
end
您可以使用以下内容:
yaml_conf_edit('conf/database.yml') do |conf|
conf['development']['database'] = db_timestamped
end