本文档记录 Zeus 插件依赖版本治理策略,作为发版前对齐依据。主仓零依赖,BOM 仅约束 plugins/* 独立 module。

治理原则

1. 最小依赖原则

每个插件只声明其直接依赖,间接依赖由 go mod tidy 自动解析。禁止手动 pin 间接依赖版本(除非解决冲突)。

2. Go 版本对齐矩阵

Go 版本由直接依赖的最低 Go 要求决定,不强行统一:

插件Go 版本原因
cache/redis1.22go-redis/v9 无更高要求
database/mysql1.22go-sql-driver/mysql
database/postgres1.22pgx/v5
database/sqlite1.22modernc.org/sqlite
mq/kafka1.22sarama
mq/nats1.22nats.go
registry/nacos1.22nacos-sdk-go/v2
log/zap1.22go.uber.org/zap
log/file_rotate1.22lumberjack.v2
job/cron1.22robfig/cron/v3
middleware/metrics1.22无第三方直接依赖
middleware/tracing1.22无第三方直接依赖
encoding/protobuf1.23google.golang.org/protobuf
metrics/prometheus1.23.0 (+toolchain go1.24.0)client_golang 要求
client/grpc1.25google.golang.org/grpc v1.81
server/grpc1.25google.golang.org/grpc v1.81
proxy/grpc1.25google.golang.org/grpc v1.81
registry/etcd1.25etcd v3.6 强制要求
config/etcd1.25etcd v3.6 强制要求
trace/otel1.25otel v1.24+
config/k8s1.26.0k8s.io/client-go v0.36.2 硬约束

规则:Go 版本由直接依赖的最低要求决定。go mod tidy 会自动还原为依赖要求的最低版本,不要手工降级。config/k8sgo 1.26.0 是 k8s client v0.36.2 的硬约束(k8s 项目跟随 Go 主线),本地需要 Go 1.26+ 工具链才能构建该插件。

3. 共享依赖对齐

跨多插件共享的直接依赖应保持版本一致:

依赖当前版本使用插件
go.uber.org/zapv1.27.0 / v1.28.0log/zap, registry/etcd, config/etcd
go.uber.org/multierrv1.10.0 / v1.11.0log/zap, etcd 系列(间接)
google.golang.org/grpcv1.81.1client/grpc, server/grpc, proxy/grpc
github.com/cespare/xxhash/v2v2.2.0 / v2.3.0多插件(间接)
github.com/klauspost/compressv1.17.9mq/kafka, mq/nats

规则:发版前用 go work sync 对齐间接依赖;直接依赖在 BOM 升级 PR 中统一更新。

4. 主仓引用策略

所有插件通过 replace github.com/go-zeus/zeus => ../../.. 引用本地主仓。

  • 开发期:保留 replace,方便联调
  • 发版时:删除 replace,require 改为正式版本号(如 v0.1.0

当前已知问题

P2:共享依赖版本漂移

依赖漂移版本建议统一
go.uber.org/zapv1.27.0 (etcd 间接) / v1.28.0 (log/zap 直接)v1.28.0(log/zap 已对齐,etcd 系列等其上游升级)
go.uber.org/multierrv1.10.0 / v1.11.0v1.11.0(log/zap 已对齐)
cespare/xxhash/v2v2.2.0 / v2.3.0v2.3.0(间接依赖,由 MVS 自动选最大值,无需手工对齐)

已完成的对齐plugins/log/zapgo.uber.org/multierr 从 v1.10.0 升到 v1.11.0(与 etcd 系列间接引入版本对齐)。

验证脚本

 1for f in plugins/*/go.mod plugins/*/*/go.mod; do
 2  echo "$f: $(grep '^go ' "$f")"
 3done | sort -t: -k2
 4
 5grep -l "replace github.com/go-zeus/zeus" plugins/*/go.mod plugins/*/*/go.mod | wc -l
 6# 验证各插件可独立构建
 7for d in plugins/*/ plugins/*/*/; do
 8  if [ -f "$d/go.mod" ]; then
 9    (cd "$d" && GOWORK=off go build ./... 2>&1 | head -5)
10  fi
11done

升级流程

  1. BOM 升级 PR:仅修改版本号,不改业务代码
  2. CI 验证:所有插件 GOWORK=off go test ./... 必须通过
  3. 发版检查:发版前确认无 replace 残留,require 指向正式版本

与主仓的关系

  • 主仓 go.mod 保持 go 1.22(用户兼容性下限)
  • 插件 Go 版本可高于主仓(因插件是独立 module)
  • go.work 取所有模块最大值(当前 1.25.0)