2012-07-31 3 views
10

http://yaml.org/spec/current.html#id2509980에 따르면 YAML 파일의 주석은 표현 세부 사항이며 serialization/representation 그래프 (http://yaml.org/spec/current.html#representation/)에 있어서는 안됩니다. Psych이 스펙에 따라 파싱하는 것처럼 보이고 주석을 잃어 버립니다. 즉, YAML 파일을 구문 분석하고 파일에 주석이 포함 된 경우와 똑같이 다시 직렬화 할 수 없음을 의미합니다. 내 의견으로는이 파일 (예 : configs)에서 주석이 중요하기 때문에 매우 이상합니다.Psych YAML 구문 분석을 포함하여

기존 라이브러리와 주석을 분석 할 수있는 사람이 누구인지 알고 있습니까? 아니면 나 혼자서 직접 할 수있는 유일한 방법입니까?

+1

그것은 스트레칭,하지만 당신은에 넣기 전에 임시 파일로 복제 한 후 한 전체 구조는 동일로 ... 직렬화 (차이를 사용하고 계십니까?) 후 두 파일을 병합 할 수 있습니다 .. 아니면 .. 그런 미친 생각이야? –

+0

[이 블로그 게시물] (https://kev.inburke.com/kevin/more-comment-preserving-configuration-parsers/)은 코멘트 보존 YAML 파서가 ruamel 인 것을 제안합니다. 이것은 Python을위한 것입니다. –

답변

0

방출 할 때 코멘트를 유지하면서 낮은 레벨의 노드를 반복 할 수 있습니다. 또한 syck 엔진이 찾고있는 결과를 제공하는지 확인할 수 있습니다.

+0

관련 http://stackoverflow.com/questions/16390330/how-do-i-update-rails-locale-yaml-file-without-loosing-comments-and-variables –

+0

관련 http://stackoverflow.com/questions/14149570/can-rubys-yaml-module-be-embed-comments –

0

나는 @ josh-voigts라는 미친 아이디어를 좋아했습니다. 여기 미친 짓이야. 댓글은 거의 어디서나 산재 해있어 작동합니다. 키 값을 변경하고 또한 의견을 유지하는 것입니다 우리는 또한 다음과 같은 몇 가지 일을 할 수

yaml_conf_edit('conf/database.yml') do |conf| 
    conf['development']['database'] = db_timestamped 
end 
1

: 당신은 같은 것을에서 사용할 수있는

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 

.

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 
관련 문제