ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

go-swagger v0.31.0 版本发布详解:扩展属性 Diff 检测、ULID 格式支持与代码生成器全面修复

go-swagger v0.31.0 版本发布详解:扩展属性 Diff 检测、ULID 格式支持与代码生成器全面修复 go-swagger v0.31.0 版本发布详解扩展属性 Diff 检测、ULID 格式支持与代码生成器全面修复【免费下载链接】go-swaggerSwagger 2.0 implementation for go项目地址: https://gitcode.com/gh_mirrors/go/go-swaggergo-swagger 于 2024-05-12 发布 v0.31.0。本版本以补全边界能力 系统修复生成器缺陷为主线swagger diff首次支持 vendor extensionx- 前缀扩展的增删与值变化检测swagger:strfmt新增 ULID 内置格式flatten/generate/validate链路上数十个 issue 得到修复。读完本文你将掌握 v0.31.0 的核心变更清单、关键新特性的实际用法以及对应源码与测试证据的检索路径便于在升级或排查问题时快速定位。一、版本概览一次面向兼容性与正确性的集中治理v0.31.0 介于 v0.30.5 与 v0.32.1 之间是 go-swagger 在 2024 年上半年的一次里程碑式发布。从本次 changelog 看它同时包含 8 项功能增强Implemented enhancements、25 项以上 bug 修复、40 条关闭的 issue 与 80 条合并的 PR覆盖面横跨diff、flatten、generate cli/client/server/model、validate、strfmt与文档站点。值得注意的版本约束随版本发布的 PR 明确要求 go-swagger 与 go-openapi 系列全线升级到 Go 1.20 起步对应 go.mod 中依赖github.com/go-openapi/*各包的版本基线。也就是说升级到 v0.31.0 意味着你的构建环境至少需要 Go 1.20。二、功能增强详解Implemented enhancements1.swagger diff支持扩展属性vendor extensions差异检测这是本版本最值得关注的能力补齐对应两个长期诉求Diff 应检测扩展值变化#2984此前swagger diff只比较 spec 的结构化字段x-前缀的 vendor extension 即便值被改写也不会被发现Diff 未报告请求参数上的扩展#2983请求参数query/header/path/formData上的扩展差异同样被遗漏。合入的 PR #2986 一并解决了这两点。在源码层diff命令位于 cmd/swagger/commands/diff.go它通过github.com/go-openapi/analysis/diff的diff.Compare(specDoc1.Spec(), specDoc2.Spec())计算两份 spec 的差异随后支持ReportAllDiffs完整报告与ReportCompatibility仅破坏性变更配合--break两种输出。扩展比较的结果会归入 NON-BREAKING CHANGES WITH WARNING 类别语义上视为带警告的非破坏性变更。仓库中的测试数据完整记录了这类输出的形态见 testdata/diff/extensions.v1.json、testdata/diff/extensions.v2.json 与期望输出 testdata/diff/extensions.diff.txt。后者展示了从操作级x-ext-1-operation、参数级Query.a.x-ext-param-a、Headers.headerB-1.x-header-ext-1、Body.c.x-ext-param-c、响应级Responses.x-ext-resp-1到响应 body 的 schema 数组元素Bodyarray[A1].x-schema-1的完整覆盖每条差异均标注Added Extension/Deleted Extension/Changed Extension Value/b/ - x-ext-b-1 - Deleted Extension /b/:get - Request - Query.a.x-ext-param-a - Deleted Extension /b/:get - Request - Query.a.x-ext-param-a-2 - Changed Extension Value /b/:get - 200 - Response - Bodyarray[A1].x-schema-1 - Deleted Extension与之配套DiffCommand支持--break/-b仅展示不兼容变更、--format/-ftxt/json、--ignore/-iJSON 格式的忽略清单文件与--dest/-d输出目标等选项其中--ignore的实现见 cmd/swagger/commands/diff.go它会将 JSON 格式的 diff 输出重新读回diff.SpecDifferences并调用FilterIgnores过滤配合 testdata/diff/ignoreFile.json 可以建立白名单式的持续集成 diff 校验。2.swagger:strfmt新增内置 ULID 格式#2467 提出为swagger:strfmt增加 ULIDUniversally Unique Lexicographically Sortable Identifier支持。v0.31.0 通过 PR #3023 合入。生成器侧的类型映射位于 generator/formats.go默认格式注册表中新增了strfmt.ULID: strfmt.ULID(\\)L49并在扩展格式别名表中登记ulid: strfmt.ULIDL176使 spec 中的format: ulid能正确映射到strfmt.ULID类型。CLI 生成的注册逻辑同步更新见 generator/templates/cli/registerflag.gotmplstrfmt.ULID与DateTime、UUID、ObjectId一样按字符串读取与注册 flag。这意味着你在模型注释或 spec 中声明format: ulid时生成的 Go 模型会直接使用strfmt.ULID并获得其内置的校验与序列化语义而无需自定义 format。同时PR #3032 收紧了 UUID 的正则校验#2878 的反馈是UUID 正则比规范更宽松保证与 OpenAPI/Swagger 规范口径一致。3.flatten与generate对定义名大小写的处理Flatten 会改变 definitions 的大小写#2334flatten 在合并外部引用时会重命名定义导致大小写漂移。PR #3014 新增了flatten 时不变换名称的选项配合既有的--keep-spec-order保持 schema 属性顺序与 spec 文件一致可以在 cmd/swagger/commands/generate/model.go 中找到对应开关的定义。从源码结构看PropertiesSpecOrder选项最终会传导至生成模型的字段排序逻辑。另一个与名称相关的修复是 PR #3024在存在特殊字符时修正名称 mangling覆盖了 #2764字段名形如 1 导致generate cli失败等场景。4. 外部$ref与多态子类型模型缺失问题#1885当 spec 通过外部$ref引用定义且存在allOf/多态discriminator结构时部分子类型模型不会被生成。v0.31.0 修复了这一跨文件引用的生成缺口与 #2346分离的 swagger 文件中定义自引用导致模型生成失败、#2216指定--keep-spec-order时跨文件引用报 Invalid ref属于同一条修复主线显著提升了多文件 spec 多态这一复杂组合下的生成稳定性。5. readOnly 属性校验#936新增对 schema 中readOnly属性的校验能力。此前readOnly更多只是文档语义标记v0.31.0 起生成端对 readOnly 字段的读写语义例如写入校验、客户端反序列化行为进行更严格的处理避免只读字段被错误地写入请求。6. 不覆盖已编辑的configure_xxx.go#397generate server生成的configure_xxx.go是用户定制 handler 的入口文件此前每次重新生成都可能被覆盖导致手工编写的代码丢失。v0.31.0 对这类半托管文件的生成策略做了改进配合生成模板调整见 PR #3026 对 templates 的跟进修复尽量做到编辑后不被无谓覆盖降低反复生成场景下的维护成本。7. 生成器新增能力与开关--rooted-error-pathPR #3031generate model新增开关定义于 cmd/swagger/commands/generate/model.go——在数组与 map 场景下用类型名而非空路径来扩展校验错误路径。它让Validate返回的错误在数组/字典字段上携带更明确的类型上下文而不是空路径对排查深层校验失败非常有用。客户端支持多种 mimePR #3042generate client可同时处理多个 Content-Type/Accept而非单 mime。无 go-openapi 依赖的新客户端构造函数PR #2979回应 #2976 的诉求生成客户端时可选用不依赖 go-openapi 模块的构造方式缓解传递依赖如 #2525 的 Helm 依赖冲突带来的兼容性问题。x-go-custom-tag支持参数PR #2957此前该扩展主要用于模型字段现在生成参数的 struct tag 也可以注入自定义 tag。类型别名支持PR #2953生成 spec 时支持 Go 类型别名type alias。三、关键 Bug 修复按模块分组速览v0.31.0 的 bug 修复几乎覆盖全部子命令按主题归组如下条目与 changelog 一一对应。1.swagger diff相关#3074向响应添加或移除 schema 未被记录到 diff 中PR #3075 修复#2962向请求体新增可选字段不应算作破坏性变更PR #3011 同时修复了新增必填属性的 diff 状态判定#2952比较具有不同响应码的 schema 时出现运行时错误#2774包含递归定义的 spec 无法执行 diff#2964schema 中存在对象类型数组字段时diff 结果缺少 URL 定位。2. CLI 代码生成generate cli#2969生成命令行代码报undefined: cliPR #3046 修复缺失 import#2764字段名形如 1 导致 CLI 生成失败PR #2766 允许数字作为字段名#2650generate cli生成的代码无法编译PR #3045 对变量与函数名做去冲突处理。3.flatten相关#2919v0.30.4 在 flatten 期间 panicPR #3015 修复 YAML marshal panic对应测试夹具见 testdata/bugs/2919#2743v0.26.0 起 flatten 不再处理嵌套目录#2657--remove-unused无法移除全部未使用定义PR #3025 递归清理未使用模型#3020circular$ref与--expand选项组合下的代码生成崩溃#2978flatten 生成错误的 swagger.yml与 YAML 输出顺序随机化 #2850 一并治理#2903flatten 报Object has no field components类错误#3059参数与响应中的相对$ref处理修复。4. 校验代码生成generate model/validate#2604生成的代码未在嵌入embedded结构体上调用Validate导致校验不完整PR #3034 修复#2587maxProperties的校验代码生成错误PR #3033 一并修复MinProperties/MaxProperties#2597minItems未生成正确的校验代码#2911判别器discriminator类型字段为nil时ContextValidatepanic#2533数组类型参数以空数组为默认值时生成非法代码#2527panic: assignment to entry in nil map。5. 服务端生成generate server#2866生成的 Go 代码出现循环引用import cycle#2773请求 Content-Type 未正确识别为multipart/form-data#2967生成的server.go默认写超时从 60s 修正为 30sPR #2968避免长连接场景下不必要的中断#2730operation 名为 client 时生成错误的 import 路径PR #3040 修复 tag 为 client 时的 import 冲突#3043tag 为 v1 时操作包名被错误 mangling#1083存在 base path 时转义参数无法生成正确的 URL 路径对应测试见 testdata/bugs/1083/pathparam_test.go。6. 客户端与文档生成#2590生成的客户端Error()函数打印指针而非值PR #3019 缓解错误报告中的指针问题PR #3026 跟进模板修复#2700描述中的换行生成错误的 markdownPR #3044 处理描述中的多行块#2938generate markdown未同时尊重--output与--targetPR #3009 为 markdown 生成增加--target支持#2982$GOPATH下生成破碎代码#2789大文件上传后 TEMPDIR 残留文件#2748传给ContextValidate的 context 不是请求 context。四、其他关闭的 issue 与社区反馈v0.31.0 还关闭了大量问题确认/用法咨询类 issue可以作为功能边界与已知限制的参考Swagger UI 相关如何禁用 Swagger UI 的 Try it out#3102、提供 SwaggerUI 中间件直接服务 spec 文件#2988、如何修改 Swagger V2 的 CSS/配色#2788安装与兼容安装失败#3067、安装文档过时#2664、Go 1.22.0/1.21.5 darwin/arm64 下swagger:response生成中断#3071、泛型结构体支持咨询#2920枚举与模型枚举字段扫描不完整#3002PR #3004 修复枚举解析、descriptionstruct tag 支持#2541、同一名字不同包的响应结构只生成最新一个#2918、模型出现无解释的 rogue 类型#2254已知限制enums_as_intstrue时文档校验失败#2890、generated client 在$GOPATH下异常#2982、CVE-2022-4742json-pointer 原型污染在依赖链路中的影响评估#2971。五、值得关注的合并 PR 与工程治理除功能与修复外本版本还合入了若干工程性改进文档站点重构#3086PR #3088/#3079使用 Hugo 重构文档站点相关工程脚本见 hack/doc-site/hugo并同步校正了swagger serve文档#3083与 custom-server 示例#3027性能优化perf(codegen)降低生成期内存分配#3063、perf(validate)升级 go-openapi/validate#3064、修复 validate 中的内存池与 race 问题#3073兼容性移除对 Go 1.19 的构建兼容代码#3038、去掉不当的 go.mod replace#3082、新增 s390x 架构支持#3099、添加 favicon#3106质量基建启用 testifylint 与 misspell linter#3068/#2992、CI 重构与 codecov 上传重试#3048/#3108、OSSF scorecard 与 codeql 工作流#3049代码现代化使用标准库errors.New替换无参fmt.Errorf#3105、use Go standard errors#2990、mockery V2 参数风格#3017。六、升级与使用建议Go 版本v0.31.0 要求 Go 1.20请先确认构建环境当前仓库 go.mod 已随后续版本演进到更高的 Go 版本作为开发者应以自己使用的发布 tag 为准。diff 策略如果你们在 CI 中用swagger diff做 spec 兼容性门禁升级后注意扩展属性差异会以 NON-BREAKING CHANGES WITH WARNING 出现可用--format json--ignore将已知差异加入白名单参考 testdata/diff/ignoreFile.json 的格式。ULID 字段在注释或 spec 中使用format: ulid即可让生成的模型采用strfmt.ULID无需自定义 format 注册。多文件 spec使用外部$ref 多态discriminator的项目本版本修复了子类型模型缺失问题建议回归验证生成结果。configure_xxx.go保护升级后重新生成服务端时注意生成器对已编辑的configure_xxx.go采用更保守的覆盖策略这是刻意为之的行为调整。七、验证路径速查diff 扩展检测的实现与测试数据cmd/swagger/commands/diff.go、testdata/diff/extensions.diff.txt、testdata/diff/ignoreFile.jsonULID 类型映射generator/formats.go、generator/templates/cli/registerflag.gotmpl生成器新开关cmd/swagger/commands/generate/model.go--keep-spec-order、--rooted-error-path各 bug 的回归夹具散落在 testdata/bugs 下如 2919flatten panic、1083转义参数路径、1083/pathparam_test.go动态路径参数测试。以上证据均可直接在仓库中复现与深入阅读帮助你确认 v0.31.0 的每一项行为变更。【免费下载链接】go-swaggerSwagger 2.0 implementation for go项目地址: https://gitcode.com/gh_mirrors/go/go-swagger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表