13

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

有谁知道是否可以用现有的库来解析评论,或者是我自己做这一切的唯一方法吗?

4

3 回答 3

2

我们也可以做一些这样的事情,这将改变键值并保留评论。

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
于 2014-10-28T10:48:38.750 回答
1

您可以迭代较低级别的节点,在发出时保留注释。此外,您可以查看 syck 引擎是否为您提供所需的结果。

于 2013-05-10T02:19:43.023 回答
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
于 2013-06-27T23:12:44.197 回答