如何用yq识别MkDocs YAML配置中Search插件并注入默认配置?
解决MkDocs YAML配置中Search插件的检测与注入问题
问题背景
在流水线任务中,需要向MkDocs的YAML配置文件注入缺失的Search插件配置,但配置里的插件列表存在两种合法形式:
形式一(无参数简洁写法):
plugins: - search
形式二(带参数的完整写法):
plugins: - search: lang: en foo: bar
现有问题:使用yq的contains函数只能检测到形式一的配置,无法识别形式二;尝试通过模板合并的方式实现需求也遇到了阻碍。
解决方案
1. 检测Search插件是否存在
使用yq的any函数遍历插件数组,同时匹配两种形式的配置:
yq 'any(.plugins[]; . == "search" or has("search"))' mkdocs.yml
- 逻辑说明:遍历
plugins数组的每个元素,判断元素是否是字符串"search"(对应形式一),或者是包含search键的对象(对应形式二),任一条件满足则返回true,表示插件已存在。
2. 自动注入缺失的Search插件配置
直接执行以下命令,若检测到Search插件不存在,则自动添加形式二的配置到原文件:
yq 'if any(.plugins[]; . == "search" or has("search")) then . else .plugins += [{"search": {"lang": "en", "foo": "bar"}}] end' mkdocs.yml -i
- 参数说明:
-i:直接修改原配置文件(若需预览修改效果,可去掉该参数,将结果输出到控制台查看)- 若原配置中没有
plugins键,命令会自动创建该键并插入目标配置
版本说明
上述命令基于mikefarah/yq v4.x版本编写,若使用v3或其他分支版本,语法会有差异,建议升级到v4版本以获得最佳兼容性。
内容的提问来源于stack exchange,提问作者Karel
相关产品推荐
相关产品推荐

