覆盖YAML节点

时间:2014-04-16 14:02:32

标签: parsing yaml

我有一个带有一些项目配置的YAML文件,我希望重用部分代码以使其易于维护。所以,我尝试使用锚来做到这一点,但我想覆盖以前的节点。这可能吗?

以下是我的例子:

default: &default
    output: &default_output
       make_video: true
       take_screenshot: true
    browser: &default_browser
       type: :chrome
       width: 1024
       height: 1280
    logger: &default_logger
       level: TRACE
       output_type: :file

chrome_browser: &chrome_browser
    <<: *default
    browser:
       type: :chrome
       user_agent: user_agent_string_for_chrome

firefox_browser: &firefox_browser
     <<: *default
     browser: 
         type: :firefox
         user_agent: user_agent_string_for_firefox

好的,所以这是第一部分:这可能吗? firefox_browser会覆盖&#34;类型&#34;?

现在是第二部分:

profile:
    <<: *default
    staging:
        europe:
            url: www.staging-europe-site.com
            chrome:
                <<: *browser_chrome
            firefox:
                <<: *browser_firefox
        america:
            url: www.staging-america-site.com
            chrome:
                <<: &browser_chrome
            firefox:
                <<: &browser_firefox                    
    live:
        europe:
            url: www.europe-site.com
            chrome:
                <<: &browser_chrome
            firefox:
                <<: &browser_firefox
        america:
            url: www.america-site.com
            chrome:
                <<: &browser_chrome
            firefox:
                <<: &browser_firefox

我可以做这样的事情,以便在读完yaml后,我能做到:

profile_yaml['staging.europe.chrome'] 

我得到了所有的配置?

1 个答案:

答案 0 :(得分:2)

至于您的第一个问题,由于密钥browser(来自default)的值已替换为chrome_browser中定义的值,因此无法执行您想要的操作。没有树合并或类似的进行。

所以对于你的第二个例子,你最终会得到:

output: 
   make_video: true
   take_screenshot: true
logger: 
   level: TRACE
   output_type: :file
browser:
   type: :chrome
   user_agent: user_agent_string_for_chrome

如果你把它转回YAML,这可能也是缺乏的。当然还有其他方法可以实现这些目标,但你必须帮助解析器这样做。