Swagger 插件
本页覆盖这三个模板:
lynx-swagger/conf/swagger-simple.ymllynx-swagger/conf/swagger.ymllynx-swagger/conf/swagger-secure.yml
关键现实是:当前运行时读取的是 swagger.go 里的自定义 YAML 结构,而不是把 protobuf / 模板字段一比一全部接线。模板里有些键是 live 的,有些已经过时,有些还改了名字。
Runtime 事实
| 项目 | 值 |
|---|---|
| Go 模块 | github.com/go-lynx/lynx-swagger |
| 配置前缀 | lynx.swagger |
| Runtime 插件名 | swagger |
| Getter 边界 | 只有实例方法 (*PlugSwagger).GetSwagger();不存在 package-level swagger.GetSwagger() |
配置前先知道
- 运行时会读取
lynx.swagger.enabled、generator、ui、info、security、api_server。 api_server.host是 Swagger UI 里 “Try it out” 真正会调用的后端地址;留空时插件 会尝试从lynx.http.addr推导。- 真正的文件监听开关是
generator.watch_files。模板里的watch_enabled当前运行时并不会读取。 - 模板里的
ui.title当前没有运行时效果,页面标题实际上来自info.title。 ui.deep_linking、ui.doc_expansion、ui.display_request_duration、ui.default_models_expand_depth都是模板时代的 snake_case 键;当前结构体期望 camelCase,而且真正渲染到 UI HTML 的只有deepLinking和docExpansion。- 模板里的
info.terms_of_service不会映射到当前运行时字段,当前结构体期望的是termsOfService。 servers、base_path、schemes、consumes、produces、tags、external_docs、security_definitions、顶层 Swaggersecurity要求,以及advanced目前都不会被运行时 YAML 结构消费。disable_in_production在当前实现里几乎总会被强制保持为true,因为SetDefaultValues()会把false又改回true。实际效果是:除非改代码,生产和 staging 仍会被拦住。
当前运行时真正读取的键
| 字段 | 作用 | 何时生效 | 默认值 / 交互关系 | 常见误配 |
|---|---|---|---|---|
enabled | 打开或关闭整个 Swagger 插件。 | 启动时。 | 默认 true。 | 在不该暴露文档面的环境里忘了关闭。 |
generator.enabled | 打开注解扫描和文档重建。 | 启动时与文件变更时。 | 默认 true;若设为 false 且 ui.enabled: true,就仍然需要 generator.spec_files。 | 关掉生成,却又没提供任何可展示的 spec 文件。 |
generator.spec_files | 在注解扫描前先加载外部 Swagger/OpenAPI 文件。 | 启动和重建时。 | 可选,但如果 generator 关闭而 UI 还要开,它就变成必需项。 | 指到工作区外的路径;当前校验会拒绝工作区外路径。 |
generator.scan_dirs | 指定扫描 Go 注解的目录。 | 仅 generator.enabled: true。 | 没配时默认 ["./"]。 | 加入不存在目录,或把仓库外路径塞进来。 |
generator.output_path | 把合并后的文档写回磁盘。 | 每次重建后。 | 默认 ./docs/openapi.yaml;以 .yaml / .yml 结尾写 YAML,其他后缀写 JSON。 | 误以为保存文件名由 spec_url 决定。 |
generator.watch_files | 打开扫描目录的文件监听。 | 仅生成开启且 scan_dirs 非空时。 | 默认 true。 | 还在用模板里的 watch_enabled,却以为 watcher 已被改掉。 |
ui.enabled | 启动或跳过 Swagger UI HTTP 服务。 | 启动时。 | 默认 true。 | 关了 UI 后还去浏览器找 /swagger。 |
ui.port | Swagger UI HTTP 服务监听端口。 | 仅 ui.enabled: true。 | 默认 8081;合法范围 1024..65535。 | 和 lynx-http 业务端口复用,导致端口冲突。 |
ui.path | Swagger UI 路由前缀。 | 仅 ui.enabled: true。 | 默认 /swagger;必须以 / 开头。 | 忘了写前导斜杠。 |
info.title | 设置 OpenAPI 标题,同时也是当前 HTML 包装页使用的页面标题。 | 启动时和重建时。 | 默认 API Documentation。 | 只改 ui.title,却疑惑页面标题没变。 |
info.description | 设置 OpenAPI 描述。 | 重建时。 | 可选。 | 把大量运维说明硬塞进这里,而不是链到外部文档。 |
info.version | 设置 OpenAPI 版本号。 | 重建时。 | 默认 1.0.0。 | 把它当部署 SHA,而不是 API 版本。 |
info.contact.name | 设置 spec 联系人名字。 | 重建时。 | 可选。 | 团队归属变了却没更新。 |
info.contact.email | 设置 spec 联系邮箱。 | 重建时。 | 可选。 | 对外文档里仍暴露一个失效邮箱。 |
info.contact.url | 设置 spec 联系链接。 | 重建时。 | 可选。 | 外部文档指向内部地址。 |
info.license.name | 设置 spec 许可证名称。 | 重建时。 | 可选。 | 和仓库真实 license 不一致。 |
info.license.url | 设置 spec 许可证链接。 | 重建时。 | 可选。 | 法务链接已过期。 |
security.environment | 标记当前环境,用于允许列表校验。 | 启动校验时。 | 默认 development。 | 忘了 ENV、GO_ENV、APP_ENV 会覆盖这个值。 |
security.allowed_environments | 允许插件运行的环境列表。 | 启动校验时。 | 默认 development、testing。 | 加了 production 还以为能绕过 disable_in_production。 |
security.disable_in_production | 阻止生产和 staging 环境启用 Swagger。 | 启动校验时。 | 当前默认逻辑会强制它回到 true,即便 YAML 写 false。 | 只改这个字段就想在生产开放 Swagger。 |
security.trusted_origins | 控制 UI 服务的 CORS 允许来源。 | 每次 UI 请求。 | 默认只允许 localhost 来源。 | 忘了把实际加载 Swagger UI 的浏览器来源加进去。 |
security.require_auth | 预期中的 UI 额外鉴权开关。 | 启动时会解析。 | 当前会存储,但 handler 并不真正执行鉴权。 | 设成 true 就以为 UI 已经被保护。 |
api_server.host | 设置 Swagger UI “Try it out” 调用的目标 API host。 | 启动和重建时。 | 留空时会尝试读取 lynx.http.addr;:8080 和 0.0.0.0:8080 会被改写成 localhost:8080。 | 留空后却没有可推导的 lynx.http.addr,或该地址浏览器根本不可达。 |
api_server.base_path | 设置 “Try it out” 的 Swagger basePath。 | 重建时。 | 可选。 | 继续填顶层 base_path,以为当前运行时会读。 |
当前已过时或无运行时效果的模板键
| 模板键 | 当前运行时状态 | 应该怎么理解 / 用什么替代 | 常见误配 |
|---|---|---|---|
generator.exclude_dirs | 不会被消费。 | 当前 generator 只保存 scan_dirs,模板里的排除逻辑还没接线。 | 以为列了 vendor / docs 就会自动跳过。 |
generator.recursive | 不会被消费。 | 目录扫描行为来自解析器实现,而不是这个 YAML 键。 | 设成 false 还以为只会浅层扫描。 |
generator.watch_enabled | 不会被消费。 | 真正的 watcher 开关是 generator.watch_files。 | 设成 false 后还在看到热更新。 |
generator.watch_interval | 不会被消费。 | 当前 watcher 使用代码内固定默认值。 | 调了它却看不到重建节奏变化。 |
generator.gen_on_startup | 不会被消费。 | 当前只要 generator 启用,启动就会重建文档。 | 设成 false 还以为启动会跳过生成。 |
ui.title | 不会被消费。 | 应改 info.title;当前页面标题读的是后者。 | 只改 ui.title。 |
ui.spec_url | 不会被消费。 | 当前 UI 会固定服务 path + "/doc.json" 和 /swagger.json。 | 以为浏览器会跟着这个 URL 取文档。 |
ui.auto_refresh | 不会被消费。 | 当前没有这项运行时支持。 | 开了它却等不到自动刷新。 |
ui.refresh_interval | 不会被消费。 |