chezmoi 模板函数 `toPrettyJson` 全解:从缩进控制到源码级实现

发布时间:2026/9/20 21:03:03
chezmoi 模板函数 `toPrettyJson` 全解:从缩进控制到源码级实现 开发工具CLI配置管理【免费下载链接】chezmoiManage your dotfiles across multiple diverse machines, securely.项目地址https://gitcode.com/gh_mirrors/ch/chezmoi点击查看免费下载toPrettyJson是 chezmoi 模板体系中用于生成“美化排版 JSON”的核心函数它把任意模板值序列化为带缩进的 JSON 字符串并允许调用者自定义缩进字符串。本文以 官方参考文档 为骨架结合 templatefuncs.go 的实现与 templatefuncs.txtar 的测试用例讲解参数语义、源码原理、与toJson的差异以及三种实战用法读完即可在 dotfiles 模板中熟练输出可读 JSON。函数签名与参数语义toPrettyJson的调用形式为toPrettyJson [indent] valuevalue任意模板值map、list、字符串、数字等将被序列化为 JSON。indent可选嵌套元素相对父级的缩进字符串。默认值为两个空格 。原文档给出的最小示例{{ dict a (dict b c) | toPrettyJson \t }}该表达式先用dict构造嵌套字典{a: {b: c}}再通过管道交给toPrettyJson \t输出结果约为{ a: { b: c } }由于indent是任意字符串你可以传入\t制表符、 四个空格甚至 以外的任意组合灵活适配不同团队或工具的缩进规范。源码实现默认缩进与参数校验在 internal/cmd/templatefuncs.go 中Config.toPrettyJsonTemplateFunc完整展现了该函数的底层逻辑func (c *Config) toPrettyJsonTemplateFunc(args ...any) string { //nolint:revive,staticcheck var ( indent value any ) switch len(args) { case 1: value args[0] case 2: var ok bool indent, ok args[0].(string) if !ok { panic(fmt.Errorf(arg 1: expected a string, got a %T, args[0])) } value args[1] default: panic(fmt.Errorf(expected 1 or 2 arguments, got %d, len(args))) } var builder strings.Builder encoder : json.NewEncoder(builder) encoder.SetEscapeHTML(false) encoder.SetIndent(, indent) must(encoder.Encode(value)) return builder.String() }从中可以提炼出几条可验证的实现事实参数个数严格接受 1 个仅value或 2 个indent, value参数其余数量会触发 panic提示expected 1 or 2 arguments。参数类型第一个参数必须是string否则 panic 并报出实际类型arg 1: expected a string, got a %T。默认缩进indent变量初始化为 两个空格与文档声明完全一致。输出实现基于标准库encoding/json的Encoder通过SetIndent(, indent)实现美化排版SetEscapeHTML(false)关闭 HTML 字符转义最终以strings.Builder收集输出。该函数在 internal/cmd/config.go 中被加入白名单并在 internal/cmd/config.go 注册为模板函数toPrettyJson: c.toPrettyJsonTemplateFunc因此它在所有 chezmoi 模板包括普通.tmpl文件与execute-template命令中开箱即用。与toJson的关键区别HTML 字符不转义toPrettyJson与toJson最值得注意的行为差异是HTML 转义。源码中显式调用了encoder.SetEscapeHTML(false)这意味着、、等字符会原样输出而不是被编码为\u0026、\u003c、\u003e。这一点由 internal/cmd/testdata/scripts/templatefuncs.txtar 中的回归测试直接锁定# test that the toPrettyJson template function does not escape HTML characters, ... exec chezmoi execute-template {{ dict a (dict b ) | toPrettyJson }} cmp stdout golden/toPrettyJson其期望输出同文件 L336-L341{ a: { b: } }作为对照chezmoi 在设置formatIndent时会对toJson进行覆盖实现见 internal/chezmoi/template.go该实现并未关闭 HTML 转义。因此当模板数据包含 URL 中的、HTML 标签字符时toPrettyJson输出的内容更“原始”、更接近直接手写的 JSON尤其适合生成需要被其他程序如 jq、curl、配置文件解析器再次读取的中间数据。实战一在execute-template中调试与生成 JSONexecute-template是验证和生成模板输出的标准入口。例如chezmoi execute-template {{ dict name chezmoi version 2 | toPrettyJson }}输出默认两空格缩进{ name: chezmoi, version: 2 }如需指定缩进将indent作为第一个参数传入chezmoi execute-template {{ dict a (dict b 1) | toPrettyJson \t }}实战二modify-template 中“读改写” JSON 文件toPrettyJson最常见的生产用途是与fromJson、setValueAtPath配合在modify-template脚本里对既有 JSON 文件做定点修改。官方在 manage-different-types-of-file.md 中给出的模板为{{- /* chezmoi:modify-template */ -}} {{ fromJson .chezmoi.stdin | setValueAtPath key.nestedKey value | toPrettyJson }}执行流程是fromJson解析 stdin 中的原始 JSON →setValueAtPath设置嵌套路径的值 →toPrettyJson把修改后的结构重新输出为排版整齐的 JSON。由于toPrettyJson不会转义 HTML 字符原文件中的等字符在重写后得以原样保留避免“读一次就变一次”的意外内容漂移。需要特别注意的是modify-template 文件不能带.tmpl扩展名否则不会被识别为修改模板。配套函数矩阵toPrettyJson并非孤立存在它属于 chezmoi 的“编码/解码”函数家族全部注册在 internal/cmd/config.go并在 mkdocs.yml 中收录方向函数说明解码fromJson/fromJsoncJSON / JSONC 字符串 → 模板值解码fromTomlTOML 字符串 → 模板值解码fromYamlYAML 字符串 → 模板值编码toJson值 → 紧凑 JSON编码toPrettyJson值 → 美化缩进 JSON不转义 HTML编码toToml值 → TOML编码toYaml值 → YAML编码toInimap → INI 格式由此可以组合出多种转换管线例如从 YAML 读取配置、改写后再以 JSON 输出fromYaml ... | toPrettyJson。无论哪种组合toPrettyJson都承担着“最终交付可读 JSON”的收尾角色。使用注意事项仅接受 12 个参数多传或少传都会触发 panic模板渲染直接失败参数顺序必须是indent在前、value在后。indent必须是字符串传入非字符串类型如数字会以 panic 终止并提示期望类型。输出以换行结尾底层json.Encoder.Encode会在 JSON 末尾追加一个换行符若需嵌入其他模板上下文可配合trim使用。文档参考完整定义见 toPrettyJson.md如希望了解fromJson等反向解析函数的细节可继续阅读同目录下的 fromJson.md、fromYaml.md 与 fromToml.md。掌握toPrettyJson之后你便能在 dotfiles 模板中随时生成结构清晰、可直接被下游工具消费的 JSON 输出——无论是调试数据、生成配置文件还是对 JSON 类 dotfile 做无损的定点修改。赞分享开发工具CLI配置管理【免费下载链接】chezmoiManage your dotfiles across multiple diverse machines, securely.项目地址https://gitcode.com/gh_mirrors/ch/chezmoi点击查看免费下载相关推荐chezmoi 模板函数 hexEncode 与 hexDecode十六进制编码与解码实战指南chezmoi 模板函数 hexEncode 与 hexDecode 十六进制编码与解码实战指南 hexEncode 与 hexDecode 是 chezmo开发工具CLI配置管理chezmoi 模板函数 hexDecode 完全指南在 dotfiles 模板中解码十六进制字符串chezmoi 模板函数 hexDecode 完全指南在 dotfiles 模板中解码十六进制字符串 hexDecode 是 chezmoi 模板系统提供的一开发工具CLI配置管理chezmoi 模板函数 dashlanePassword从 Dashlane 安全取回结构化密码数据chezmoi 模板函数 dashlanePassword从 Dashlane 安全取回结构化密码数据 导读 dashlanePassword 是 chezm开发工具CLI配置管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考