如何在YAML中引用多行字符串并实现内容注入扩展?
解决YAML多行字符串合并的问题
你原来的写法无效,是因为<<:是YAML的映射合并操作符,只能用于键值对组成的映射结构,而你定义的configOverwrites是一个多行字符串(用|标记),不是映射,所以没法用<<:来合并。
下面给你几个可行的解决方案:
方案一:用结构化映射(最推荐)
把配置改成YAML的映射结构,这样既能利用锚点合并,又方便后续维护,最后在代码里把映射转换成INI格式的字符串就行:
# 定义基础配置映射 configOverwrites: &base_config sqlalchemy: url: http://myurls # 合并基础配置,同时添加新内容 migrationConfigOverwrites: <<: *base_config logger_sqlalchemy: level: INFO
比如用Python的configparser模块,就能轻松把这个映射转成你要的INI格式多行字符串。
方案二:用PyYAML的扩展标签(如果你的工具支持)
如果一定要在YAML里直接生成合并后的多行字符串,可以用PyYAML提供的!join标签来拼接字符串:
configOverwrites: &base_config | [sqlalchemy] url = http://myurls migrationConfigOverwrites: !join - *base_config - | [logger_sqlalchemy] level = INFO
注意:这个方法是PyYAML的扩展功能,不是标准YAML语法,其他YAML解析器可能不支持哦。
方案三:手动拼接(简单但维护性差)
如果你的配置内容不多,也可以直接把基础配置的内容复制到migrationConfigOverwrites里,再追加新内容:
configOverwrites: &base_config | [sqlalchemy] url = http://myurls migrationConfigOverwrites: | [sqlalchemy] url = http://myurls [logger_sqlalchemy] level = INFO
这种方法虽然直接,但以后修改基础配置时,得同步修改这个地方,适合小体量的配置。
内容的提问来源于stack exchange,提问作者Yonoss
相关产品推荐
相关产品推荐

