Ruby将注释块附加到YAML文件

时间:2016-11-03 14:16:45

标签: ruby-on-rails ruby yaml

我有一个yml文件,用于存储我在版本之间添加的故事列表。

我正在使用rake任务根据我添加到此文件的故事动态更新版本号。

它正在引入一个新流程,因此我创建了以下注释块,这将有助于任何评论此处的人以正确的格式添加故事:

#  Version control file.
#  Versions should be incremented as follows
#
#   [X - major change] . [V - new feature] . [I - Bug fix / Small change]
#
#  Update the undefined block with a one line readable description of what your story was about. example:
#
#  undefined:
#    stories:
#    - "I - fixed spelling mistake"
#    - "V - added import functionality"
#    - "X - rebuilt the main dashboard"
#

问题是在我的rake任务完成后,文件丢失了注释块。

我几乎加载了YAML versions = YAML.load_file( 'doc/release.yml' )然后在逻辑完成后我File.open("doc/release.yml", 'w') { |f| YAML.dump(versions, f) }

versions是新更新的哈希值。但是,这会删除文件的注释块。

我发现的其他解决方案只是修改现有的行。

有没有办法打开文件并添加上面的内容而不会弄乱下面的YAML。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

转储丢失的评论是不幸的。 您有两种选择:

  1. 将您的版本哈希转换为yaml (function (window) { window.__env = window.__env || {}; window.__env.key1 = "key1"; window.__env.key2 = "key2"; }(this)); ,添加注释并使用{ :a => 'b'}.to_yaml自行执行转储,您可以覆盖正常 以这种方式在YAML中的.dump方法
  2. 将注释分配给yaml文件末尾的某个虚拟值 这样它们就会被读入版本并保存。

答案 1 :(得分:1)

这是一个可能的解决方案。


2624/2900 [==========================>...] - ETA: 0s
acc: 2.38%
loss: 44.35%

使用release.yml:

require 'yaml'

versions_yaml = File.read('release.yml')
versions = YAML.load(versions_yaml)
comments = versions_yaml.scan(/^#.*?$/)

File.open("release2.yml", 'w') { |f|
  f.puts comments
  YAML.dump(versions, f)
}

puts File.read("release2.yml")

输出:

# I'm a comment on first line
---
- 1
- 2
- 3
# I'm a comment somewhere in the middle
- - 4
  - 5

答案 2 :(得分:1)

我想出了一种在向yaml中转储之前向我的哈希添加注释的方法。我用它来初始化带有嵌入式注释的配置文件,以记录配置选项。这是一个有限的解决方案。例如,没有数组内注释。但这适用于简单的情况。

cfg = {
  c: 'This is a comment',
  'foo' => 'bar',
  'level2' => {
    'level3' => {
      'foo' => 'bar',
      c1: 'This is a comment (line 1)',
      c2: 'This is a comment (line 2)',
      'foo2' => 'bar2',
    },
  },
}

YAML.dump(cfg).each_line do |l|
  if l.match(/:c(\d+)?:/)
    l.sub!(/:c(\d+)?:/, '#')
    l.sub!(/(^\s*# )["']/, '\1')
    l.sub!(/["']\s*$/, '')
  end
  puts l
end

产生:

---
# This is a comment
foo: bar
level2:
  level3:
    foo: bar
    # This is a comment (line 1)
    # This is a comment (line 2)
    foo2: bar2