我有一个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。任何帮助将不胜感激。
答案 0 :(得分:1)
转储丢失的评论是不幸的。 您有两种选择:
(function (window) {
window.__env = window.__env || {};
window.__env.key1 = "key1";
window.__env.key2 = "key2";
}(this));
,添加注释并使用{ :a => 'b'}.to_yaml
自行执行转储,您可以覆盖正常
以这种方式在YAML中的.dump方法答案 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