跳转到内容

弃用策略

本文档定义了 Plumego 在稳定版本中管理公开 API、扩展包和配置接口弃用的方式。

本策略适用于:

  • 稳定库根 (core, router, contract, middleware, security, store, health, log, metrics) — 从 v1 开始的正式兼容性承诺。
  • 规范参考 (reference/standard-service) — 与稳定根 API 保持同步,不作为可复用的扩展目录。
  • CLI (cmd/plumego) — 受支持的命令行工具;不是 Go 导入接口。

本策略适用于:

  • x/* 扩展包——具体规则见下方各层级说明。
  • 内部包(internal/,未导出符号)——实现细节,可能在不通知的情况下变更。
  • _test.go 文件中的测试辅助函数。
  • 没有外部兼容性承诺的预发布迁移包装器和兼容垫片。

Agent 清理规则:一旦仓库中最后一个调用方已迁离预发布或内部兼容包装器,应在同一次变更中移除该包装器。不要仅因为它在迁移期间有用就保留死包装器。

x/* 扩展包遵循 扩展稳定性策略 中定义的成熟度阶梯。兼容性规则因层级而异:

层级模块兼容性规则
betax/gateway, x/observability, x/rest, x/websocket导出 API 在次要版本发布引用之间冻结。破坏性变更需要新的标记引用和快照对比。不允许静默破坏。
experimental其他所有 x/*无兼容性冻结。API 和配置可能在任意提交之间变更。有明确理由时采用,不要默认采用。
ga暂无完整的稳定根级兼容性承诺。

experimental 升级到 beta 需要在 specs/extension-beta-evidence.yaml 中记录证据。

对于稳定根中每个导出符号(类型、函数、接口、常量、变量):

  • 其签名在主版本内不会以不兼容的方式变更。
  • 包不会在主版本内重命名或移除。
  • godoc 中记录的行为不会静默退化。

新的主版本(如 v2)是破坏性变更的受支持机制。

在符号上方紧接着添加 // Deprecated: godoc 注释,包含:

  • 替代内容(包路径、函数名或方法)。
  • 引入弃用通知的版本。
  • 计划移除的版本(主版本号,或尚未确定时填 “TBD”)。
// Deprecated: Use middleware/httpmetrics.Middleware instead.
// Deprecated since: v1.0.0. Planned removal: v2.
func OldMiddlewareHelper(...) { ... }

每次弃用必须出现在引入弃用通知的版本的发布说明中。

弃用符号在弃用通知发布后至少保持一个完整主版本的功能正常。

  • v1.x 中弃用 → v2.0 时可以移除。
  • v2.x 中弃用 → v3.0 时可以移除。

第 4 步 — 在下一个主版本中移除

Section titled “第 4 步 — 在下一个主版本中移除”

移除只在主版本边界发生,并且必须列入该主版本的迁移指南。

扩展包(x/*)——无兼容性冻结

Section titled “扩展包(x/*)——无兼容性冻结”

扩展包处于实验性状态,可能:

  • 在次要版本之间更改 API 签名。
  • 在不升级主版本的情况下重命名、拆分、合并或移除。
  • 晋升为稳定根状态(从该时刻起适用完整弃用流程)。

依赖 x/* 包的用户应将依赖固定到特定发布版本,并在每次升级时查阅发布说明。

以下变更视为破坏性变更,不需要弃用通知:

  • 添加新的导出符号(函数、类型、常量、变量)。
  • 向使用构造函数的结构体添加新的可选字段。
  • 向具体类型添加新方法。
  • 修复旧行为与文档合约不符的 bug。
  • 更改未导出(内部)代码的行为。
  • 改进错误消息,且不更改错误码或 HTTP 状态码。
  • 高风险包(core, router, contract, security)的弃用决策需要由 module.yaml 中列出的运行时或安全所有者审查。
  • 中等风险包的弃用决策可由模块所有者做出。
  • 所有弃用必须在发布前通过标准发布门控:make gates

v1.0 时暂无弃用。