Complug 采用 Monorepo (单仓多模块) 架构,核心目标是实现极致的依赖隔离与能力标准化。
- 绝对解耦:
components/(标准层)严禁依赖contrib/(实现层)。 - 零污染:
components/模块禁止引入任何非 Go 标准库的第三方依赖。 - 物理隔离:每个子目录必须拥有独立的
go.mod文件,确保用户可以“按需引入”,避免引入无关的三方驱动。
该目录定义各领域的抽象标准(插座标准)。
- 职责:定义
interface、基础数据模型struct、枚举常量和 Sentinel Errors。 - 约束:
- 必须包含独立的
go.mod。 - 文件名规范:
api.go(存放接口定义),types.go(存放通用模型)。 - 禁止包含具体实现逻辑(如连接池管理、协议解析等)。
- 必须包含独立的
该目录提供针对第三方库的具体适配实现(插头)。
- 职责:将第三方 SDK(如 Kafka, Redis, GORM)的功能适配到
components定义的接口上。 - 约束:
- 目录结构必须与领域对应:
/contrib/{domain}/{driver}。 - 必须包含独立的
go.mod。 - 开发阶段必须通过
replace指令引用本地的components模块。
- 目录结构必须与领域对应:
- 上下文支持:所有涉及 I/O、网络或耗时操作的方法,第一个参数必须是
context.Context。 - 错误处理:驱动层需负责将三方 SDK 的原始错误包装或转换为
components定义的标准错误。 - 类型安全:在处理 Payload 数据或数据库 Record 时,优先使用 Go 泛型(Generics)。
- 每个
contrib模块必须暴露一个New{Driver}Provider或New{Driver}Client函数。 - 返回类型强制:函数必须返回
components中定义的 Interface,而非驱动层的具体结构体指针。- OK:
func NewKafka(...) (queue.Provider, error) - Err:
func NewKafka(...) *KafkaAdapter
- OK:
- Go 版本:全项目 Go 版本必须对齐(建议
1.21及以上)。 - 依赖声明原则:
components模块的依赖树深度应尽可能为 0(仅限标准库)。contrib模块仅能引用其对应的components模块及该驱动必要的三方 SDK。
- 模块路径命名:
- 核心层:
github.com/{org}/complug/components/{domain} - 实现层:
github.com/{org}/complug/contrib/{domain}/{driver}
- 核心层:
# Kafka 适配
go get github.com/alonexy/complug/contrib/queue/kafka@v1.0.2
# RabbitMQ 适配
go get github.com/alonexy/complug/contrib/queue/rabbitmq@v1.0.2
# Protobuf Codec
go get github.com/alonexy/complug/contrib/queue/protobuf@v1.0.2当使用 AI 辅助开发时,请严格遵守以下逻辑:
- 新建组件顺序:先在
components/下定义纯接口,并初始化go.mod;确认无误后,再在contrib/下开发实现。 - 依赖冲突检查:若 AI 试图在
components/中使用go get引入第三方包,必须立即中止并报错。 - Monorepo 自动适配:生成代码时,AI 应自动识别目录深度并正确编写
go.mod中的replace路径(如../../components/xxx)。
- 1. 在
components/{domain}下定义标准接口。 - 2. 在该目录下运行
go mod init。 - 3. 在
contrib/{domain}/{driver}下创建对应的实现目录。 - 4. 在实现目录下运行
go mod init并replace接口模块。 - 5. 编写适配器逻辑并实现所有接口契约。
- 6. 编写单元测试,确保驱动完全符合接口预期。