2012-07-31 83 views
10

根据http://yaml.org/spec/current.html#id2509980在YAML文件中的评论是一个演示的细节,不得在序列化/表示图(http://yaml.org/spec/current.html#representation/)。它看起来像Psych是根据规范进行解析并丢失了注释,这意味着当文件包含注释时,无法解析YAML文件并再次以完全相同的方式将其序列化。在我看来,这很奇怪,因为评论在这样的文件中很重要(例如配置)。心理YAML解析包括评论

有谁知道是否有可能解析与现有的库的评论或是唯一的方法去做这一切由我自己?

+1

这是一个延伸,但你可以克隆它到一个临时文件中加载它之前,然后将两个文件合并序列化(使用差异?)后...只要整体结构是一样的..或...是那种疯狂的想法......? – 2012-08-24 19:51:03

+0

[此博客文章](https://kev.inburke.com/kevin/more-comment-preserving-configuration-parsers/)建议唯一保留注释的YAML解析器是ruamel,它是用于Python的。 – 2017-12-20 15:17:18

回答

0

您可以迭代较低级别上的节点,在发射时保留注释。此外,你可以看到syck引擎是否给你你正在寻找的结果。

+0

相关http://stackoverflow.com/questions/16390330/how-do-i-update-rails-locale-yaml-file-without-loosing-comments-and-variables – 2013-05-10 02:22:06

+0

相关http://stackoverflow.com/questions/14149570 /罐RUBYS-YAML模块待用于到嵌入-评论 – 2013-05-10 02:23:12

0

我喜欢@ josh-voigts疯狂的想法。这是一个疯狂的实现。评论可以穿插在几乎任何地方,它的作品!

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 
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