ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

go-swagger expand 命令完全指南:将 Swagger 2.0 规范中的 $ref 全部内联展开

go-swagger expand 命令完全指南:将 Swagger 2.0 规范中的 $ref 全部内联展开 代码生成开发工具后端API设计【免费下载链接】go-swaggerSwagger 2.0 implementation for go项目地址https://gitcode.com/gh_mirrors/go/go-swagger点击查看免费下载swagger expand是 go-swagger 工具链中用于规范spec转换的核心命令之一它负责解析 Swagger 2.0 文档中所有$ref引用无论是本地 JSON Pointer 还是远程文件并把引用内容就地替换为完整的内联 schema最终输出一份自包含的展开后规范。读完本文你将掌握expand的完整命令行用法、每个选项的准确语义、其底层实现原理加载、展开、序列化三个阶段以及与flatten命令的适用场景取舍并了解仓库中对应的测试用例与限制边界。概述什么是 spec 展开ExpandSwagger 2.0 规范允许通过$ref字段引用文档内部或其他文件中的 schema、参数与响应定义。这样的设计有利于复用与模块化但也带来了两个实际问题一是下游消费方如代码生成器、Mock 工具需要自行解析多级引用二是当规范分散在多个文件时难以整体分发与审计。expand命令正是为消除这些问题而生。按 docs/usage/expand.md 的原始定义Expanding a specification resolve all$ref(remote or local) and replace them by their expanded content in the main spec document.即把规范中所有$ref无论远程还是本地解析出来并替换为展开后的内容写回主规范文档。展开完成后产物中不再存在任何$ref指针全部 schema 都以字面内联形式存在。在项目首页文档中这一能力被归入Transform specs规范转换工具集与flatten、mixin并列见 docs/_index.md# Resolve and expand $refs in your spec as inline definitions swagger expand {spec}命令在 CLI 层注册为顶层子命令注册代码位于 cmd/swagger/swagger.go_, err parser.AddCommand(expand, expand $ref fields in a swagger spec, expands the $refs in a swagger document to inline schemas, commands.ExpandSpec{})命令用法与全部选项要展开一份规范直接执行swagger expand {spec}其中{spec}是唯一的必填位置参数可以是本地文件路径也可以是可被loads.Spec解析的远程 URL。完整的帮助信息如下来自原文档Usage: swagger [OPTIONS] expand [expand-OPTIONS] {spec} expands the $refs in a swagger document to inline schemas Application Options: -q, --quiet silence logs --log-outputLOG-FILE redirect logs to file Help Options: -h, --help Show this help message [expand command options] --compact applies to JSON formatted specs. When present, doesnt prettify the json -o, --output the file to write to --format[yaml|json] the format for the spec document (default: json)各选项的语义与默认值汇总如下选项类型默认值说明{spec}位置参数必填待展开的 Swagger 2.0 文档本地文件或远程 URL必须且只能指定一个--compact布尔开关关仅作用于 JSON 格式输出开启后不再美化 JSON不缩进生成紧凑单行 JSON-o, --output字符串空输出文件路径留空或传-时直接打印到标准输出stdout--format枚举json输出文档格式仅允许yaml或json两个取值-q, --quiet全局选项关静默日志输出log.SetOutput(io.Discard)--log-outputLOG-FILE全局选项—将日志重定向写入指定文件-h, --help全局选项—打印帮助信息参数约束必须提供且只能提供一个 specexpand对位置参数有严格校验。在 cmd/swagger/commands/expand.go 中Execute方法首先检查参数个数func (c *ExpandSpec) Execute(args []string) error { if len(args) ! 1 { return errors.New(expand command requires the single swagger document url to be specified) } swaggerDoc : args[0] ... }如果传入 0 个或多个 spec 参数命令会直接报错expand command requires the single swagger document url to be specified并退出。这一行为由测试用例 TestCmd_Expand 覆盖验证它通过testRequireParam断言空参数执行必然返回错误。底层实现原理加载、展开、序列化三段式整个命令的实现非常精简全部逻辑集中在 cmd/swagger/commands/expand.goExecute方法只有三步。第一步加载规范文档specDoc, err : loads.Spec(swaggerDoc)这里使用 go-openapi 生态的loads包完成文档加载。它负责读取文件内容、解析 JSON/YAML、校验基本结构并建立引用解析链使后续展开操作能够追踪文档内外的每一个$ref。第二步执行展开exp, err : specDoc.Expanded()Expanded()是loads.Document提供的展开方法底层由 go-openapi 的 spec 包驱动。它会遍历文档中所有$ref包括#/definitions/...这样的本地指针和指向外部文件的远程引用把引用的目标内容复制到引用位置。展开完成后exp.Spec()返回的规范对象中不再残留任何$ref。值得说明的是expand命令自身不提供任何展开行为级别的选项——这是刻意设计的简单命令要么全部展开要么不执行详见 expand.go 中ExpandSpec的注释 There are no specific options for this expansion.。如果你需要更细粒度的控制如仅打包远程引用、保留命名等应使用下一节介绍的flatten命令。第三步按格式序列化并写出return writeToFile(exp.Spec(), !c.Compact, c.Format, string(c.Output))输出阶段由writeToFile函数完成其序列化逻辑cmd/swagger/commands/expand.go可概括为三个分支asJSON : format json switch { case pretty asJSON: b, err json.MarshalIndent(swspec, , ) // JSON 美化默认 case asJSON: b, err json.Marshal(swspec) // JSON 紧凑--compact default: b, err marshalAsYAML(swspec) // YAML 输出 }--formatjson默认且未加--compact使用json.MarshalIndent以两个空格缩进输出美化后的 JSON--formatjson且加--compact改用json.Marshal输出紧凑 JSON用于减小文件体积或便于管道处理--formatyaml先序列化为 JSON再经yamlutils.YAMLMapSlice中间结构转换为 YAML 文本见marshalAsYAMLexpand.go。注意 YAML 输出不受--compact影响。输出目标的判定同样在writeToFile中switch output { case , -: _, e : fmt.Fprintf(defaultWriter, %s\n, b) // 打印到 stdout default: return os.WriteFile(output, b, readableMode) // 写入文件0644 }不指定-o或传入-o -结果打印到标准输出defaultWriter默认即os.Stdout见 expand.go适合配合 shell 管道与重定向指定-o文件路径以0o644 fs.ModePerm权限写入目标文件。配套测试行为如何被验证仓库通过 cmd/swagger/commands/expand_test.go 对上述行为做了四组测试TestCmd_Expand断言缺少参数时报错testRequireParamTestCmd_Expand_NoError对 testdata/bugs/1536/fixture-1536.yaml 执行展开并写入临时 JSON 文件断言成功testProduceOutputTestCmd_Expand_NoOutputFile将defaultWriter替换为io.Discard验证未指定输出文件时直接写 stdout 的路径不报错TestCmd_Expand_Error对 testdata/expansion/invalid-refs.json其中$ref指向不存在的NotCorrectRef执行展开断言必然失败testValidRefs。实战示例从命令到产物用仓库自带的引用型 spec 做实验仓库的 testdata/expansion/circularSpec.yaml 是一个包含本地引用与自引用related_books指向Book自身的典型示例paths: /books: get: ... responses: 200: schema: type: array items: $ref: #/definitions/Book definitions: Book: type: object properties: title: type: string summary: type: string related_books: type: array items: $ref: #/definitions/Book Error: type: object properties: code: type: integer message: type: string执行展开输出到文件保持 JSON 美化swagger expand testdata/expansion/circularSpec.yaml -o expanded.json产出的expanded.json中/books响应的items不再是指针{$ref: #/definitions/Book}而是Book的完整 schema 内联副本同样related_books.items也会递归内联展开。展开后文档仍保留definitions节点但所有引用位置均已实体化。其他常见用法# 输出紧凑 JSON体积更小便于机器消费 swagger expand swagger.json --compact # 输出 YAML 格式 swagger expand swagger.json --formatyaml # 直接打印到标准输出交给管道继续处理 swagger expand swagger.json | jq . # 同时指定输出文件与格式 swagger expand swagger.yaml --formatjson -o swagger-expanded.json远程引用与本地引用的统一处理loads.Spec支持以 URL 形式加载文档因此expand同样可以展开远程引用。例如swagger expand https://example.com/api/swagger.json -o local-expanded.json展开过程中外部文件里的$ref会被解析并内联进主文档最终产物是完全自包含的单一文件。这一点让expand成为规范归档、离线分发和第三方工具对接前的理想预处理步骤。expand 与 flatten何时该用哪一个expand与 flatten 命令 是 go-swagger 中极易混淆的一对规范转换命令二者都处理$ref但目标截然不同维度expandflatten默认 minimal目标把所有$ref替换为内联内容产物无引用把远程$ref打包进#/definitions并把内联复杂 schema 提升为命名定义产物特征引用全消失可能出现重复内联副本引用收敛为本地定义引用无远程引用、无复杂内联典型场景测试、审计、单文件分发作为代码生成前的规范预处理从 cmd/swagger/commands/flatten.go 可以看到flatten的默认选项是Minimal: true, Verbose: true即最小化改动 详细日志它通过 go-openapi 的analysis.Flatten把远程引用归拢为命名定义并规范化 JSON Pointer。而expand则直接调用specDoc.Expanded()不做任何命名化处理。生成命令中的 --with-expand除了独立的expand子命令展开能力还以--with-expand选项的形式内嵌到所有代码生成命令generate client/server/model/operation等的共享预处理选项中定义见 cmd/swagger/commands/generate/shared.gotype FlattenCmdOptions struct { WithExpand bool description:expands all $refs in the spec (shorthand to --with-flattenexpand) group:shared long:with-expand WithFlatten []string choice:minimal choice:full choice:expand choice:verbose choice:noverbose choice:remove-unused choice:keep-names default:minimal default:verbose ... }--with-expand等价于--with-flattenexpand在 SetFlattenOptions 中WithExpand或WithFlatten中出现expand都会把FlattenOpts.Expand置为true并且展开选项会优先于minimal/full生效源码注释明确写着 expand flag takes precedence。需要注意的是旧版 CLI 中跳过 flatten的--skip-flatten选项已被移除官方迁移说明docs/_index.md明确指出应以--with-expand取代。注意事项与已知限制从源码注释generator/spec.go可以明确看到spec 展开虽然强大但存在若干已知边界官方在代码中直接给出了警示NOTE(fredbi): spec expansion may produce some unsupported constructs and is not yet protected against the following cases:polymorphic types generation may fail with expansion (expand destructs the reuse intent of the $ref in allOf)name duplicates may occur and result in compilation failures翻译成实践建议多态类型polymorphic types慎用展开若 schema 通过allOf$ref表达继承/多态展开会破坏$ref的复用意图可能导致生成代码失败名称冲突风险内联展开可能引入重复的命名定义进而引发编译错误无效引用会直接失败当$ref指向不存在的目标如 testdata/expansion/invalid-refs.json 中的NotCorrectRef时Expanded()会返回错误命令以非零状态退出——这一点由TestCmd_Expand_Error保证循环引用规范允许自引用与相互引用仓库示例见 testdata/expansion/circularRefs.json其中car通过oneCar、similar等字段引用自身。expand能处理这类结构但生成的文档会包含层层内联的递归结构体积增长明显人工阅读困难。相比之下flatten通过保留命名定义能更优雅地表达循环。在serve命令内部展开逻辑还提供了更细的选项cmd/swagger/commands/serve.gospecDoc, err specDoc.Expanded(spec.ExpandOptions{ SkipSchemas: false, ContinueOnError: true, AbsoluteCircularRef: true, })这印证了Expanded()底层接受ExpandOptions配置是否跳过 schema、是否遇错继续、是否将循环引用转为绝对路径只是独立expand命令未对外暴露这些开关。小结swagger expand是一个少即是多的规范转换命令三个选项--compact、-o/--output、--format、一个必填 spec 参数配合稳定的三段式实现加载 → 展开 → 序列化即可把任何引用了本地或远程$ref的 Swagger 2.0 文档转换为单文件、无引用的自包含规范。在需要规范化归档、离线分发或供不支持$ref解析的工具消费时它是 go-swagger 工具链中直接可用的首选方案而在代码生成等需要保留定义命名与多态结构的场景则应优先考虑默认的flatten预处理或显式选择--with-flattenminimal|full等模式。赞分享代码生成开发工具后端API设计【免费下载链接】go-swaggerSwagger 2.0 implementation for go项目地址https://gitcode.com/gh_mirrors/go/go-swagger点击查看免费下载相关推荐go-swagger validate 命令完全指南使用 JSON Schema 与语义规则校验 Swagger 2.0 规范go swagger validate 命令完全指南使用 JSON Schema 与语义规则校验 Swagger 2.0 规范 swagger validat代码生成开发工具后端API设计go-swagger 规范变换完全指南expand、flatten、mixin 与 diff 四大预处理命令go swagger 规范变换完全指南expand、flatten、mixin 与 diff 四大预处理命令 swagger 工具链go swagger除代码生成开发工具后端API设计go-swagger generate 命令完全指南从 Swagger 2.0 规范生成服务端、客户端与文档go swagger generate 命令完全指南从 Swagger 2.0 规范生成服务端、客户端与文档 swagger generate 是 go sw代码生成开发工具后端API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表