2012-07-31 90 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