docs: 定义插件依赖模型和分类
新增 PLUGIN_DEPENDENCY.md: - 定义独立插件和依赖插件两种类型 - 独立插件:只依赖 core(screen, wifi, video) - 依赖插件:依赖其他插件(ble→wifi, http→video) - 设计依赖声明机制(dependencies() 方法) - 设计启动顺序管理(拓扑排序) - 规划 Phase 2/3 插件依赖关系 三个团队并行任务: - 产品团队:梳理所有插件功能和依赖关系 - 架构团队:设计依赖机制技术实现 - 开发团队:为现有插件添加依赖声明 评审机制:三个团队交叉评审,CEO 最终确认
This commit is contained in:
240
PLUGIN_DEPENDENCY.md
Normal file
240
PLUGIN_DEPENDENCY.md
Normal file
@@ -0,0 +1,240 @@
|
||||
# ShowenV2 插件依赖模型
|
||||
|
||||
## 插件分类
|
||||
|
||||
### 独立插件(Independent Plugins)
|
||||
**定义**: 只依赖 core,不依赖其他插件,可以独立运行
|
||||
|
||||
**特点**:
|
||||
- 自包含,功能完整
|
||||
- 只通过 core 的消息机制与其他插件通信
|
||||
- 可以单独测试和部署
|
||||
- 启动顺序无要求
|
||||
|
||||
**示例**:
|
||||
- screen - 屏幕管理(唤醒锁、光标控制)
|
||||
- wifi - WiFi 管理(扫描、连接、热点)
|
||||
|
||||
### 依赖插件(Dependent Plugins)
|
||||
**定义**: 依赖其他插件的功能,需要特定插件先启动
|
||||
|
||||
**特点**:
|
||||
- 功能依赖其他插件
|
||||
- 需要声明依赖关系
|
||||
- 启动顺序有要求
|
||||
- 通过消息机制与依赖插件通信
|
||||
|
||||
**示例**:
|
||||
- ble - 依赖 wifi(通过 BLE 配置 WiFi)
|
||||
- http - 依赖 video(通过 HTTP API 控制视频播放)
|
||||
|
||||
---
|
||||
|
||||
## 依赖关系图
|
||||
|
||||
```
|
||||
独立插件层:
|
||||
┌─────────┐ ┌─────────┐ ┌─────────┐
|
||||
│ screen │ │ wifi │ │ video │
|
||||
└─────────┘ └─────────┘ └─────────┘
|
||||
↑ ↑ ↑
|
||||
│ │ │
|
||||
└────────────┴────────────┘
|
||||
core
|
||||
|
||||
依赖插件层:
|
||||
┌─────────┐ ┌─────────┐
|
||||
│ ble │ │ http │
|
||||
│ (依赖 │ │ (依赖 │
|
||||
│ wifi) │ │ video) │
|
||||
└─────────┘ └─────────┘
|
||||
↑ ↑
|
||||
│ │
|
||||
└────────────┘
|
||||
core
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 插件依赖声明
|
||||
|
||||
### Plugin Trait 扩展
|
||||
```rust
|
||||
pub trait Plugin: Send {
|
||||
fn info(&self) -> PluginInfo;
|
||||
|
||||
// 新增:声明依赖的插件
|
||||
fn dependencies(&self) -> Vec<&'static str> {
|
||||
vec![] // 默认无依赖
|
||||
}
|
||||
|
||||
fn init(&mut self, ctx: PluginContext) -> Result<()>;
|
||||
fn start(&mut self) -> Result<()>;
|
||||
fn handle_message(&mut self, msg: Message) -> Result<()>;
|
||||
fn stop(&mut self) -> Result<()>;
|
||||
}
|
||||
```
|
||||
|
||||
### 依赖声明示例
|
||||
```rust
|
||||
impl Plugin for BlePlugin {
|
||||
fn dependencies(&self) -> Vec<&'static str> {
|
||||
vec!["wifi"] // BLE 依赖 WiFi 插件
|
||||
}
|
||||
}
|
||||
|
||||
impl Plugin for HttpPlugin {
|
||||
fn dependencies(&self) -> Vec<&'static str> {
|
||||
vec!["video"] // HTTP 依赖 Video 插件
|
||||
}
|
||||
}
|
||||
|
||||
impl Plugin for WifiPlugin {
|
||||
fn dependencies(&self) -> Vec<&'static str> {
|
||||
vec![] // WiFi 是独立插件
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 启动顺序管理
|
||||
|
||||
### ServiceManager 职责
|
||||
1. **依赖检查**: 启动前检查所有依赖是否满足
|
||||
2. **拓扑排序**: 根据依赖关系计算启动顺序
|
||||
3. **顺序启动**: 按照拓扑排序结果依次启动插件
|
||||
4. **错误处理**: 依赖插件启动失败时,跳过依赖它的插件
|
||||
|
||||
### 启动流程
|
||||
```
|
||||
1. 注册所有插件
|
||||
2. 构建依赖图
|
||||
3. 检查循环依赖(报错)
|
||||
4. 拓扑排序
|
||||
5. 按顺序 init() 所有插件
|
||||
6. 按顺序 start() 所有插件
|
||||
```
|
||||
|
||||
### 示例启动顺序
|
||||
```
|
||||
Phase 1: 独立插件
|
||||
- screen.init() → screen.start()
|
||||
- wifi.init() → wifi.start()
|
||||
- video.init() → video.start()
|
||||
|
||||
Phase 2: 依赖插件
|
||||
- ble.init() → ble.start() (依赖 wifi)
|
||||
- http.init() → http.start() (依赖 video)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 消息通信模式
|
||||
|
||||
### 独立插件
|
||||
- 接收 Broadcast 消息
|
||||
- 发送消息给 core
|
||||
- 不直接与其他插件通信
|
||||
|
||||
### 依赖插件
|
||||
- 接收 Broadcast 消息
|
||||
- 发送消息给特定插件(通过 core 路由)
|
||||
- 等待依赖插件的响应消息
|
||||
|
||||
### 消息路由示例
|
||||
```rust
|
||||
// BLE 请求 WiFi 扫描
|
||||
ble_plugin.send(Message::WifiCommand(WifiCommand::Scan));
|
||||
|
||||
// WiFi 返回扫描结果(Broadcast)
|
||||
wifi_plugin.send(Message::WifiResult(result));
|
||||
|
||||
// BLE 接收到 WifiResult 消息
|
||||
ble_plugin.handle_message(Message::WifiResult(result));
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 当前插件分类
|
||||
|
||||
### 独立插件
|
||||
| 插件 | 功能 | 依赖 | 状态 |
|
||||
|------|------|------|------|
|
||||
| screen | 屏幕管理 | core | ✅ 完成 |
|
||||
| wifi | WiFi 管理 | core | ✅ 完成 |
|
||||
| video | 视频播放 | core | ✅ 完成 |
|
||||
|
||||
### 依赖插件
|
||||
| 插件 | 功能 | 依赖 | 状态 |
|
||||
|------|------|------|------|
|
||||
| ble | 蓝牙配网 | core + wifi | ✅ 完成 |
|
||||
| http | HTTP API | core + video | ✅ 完成 |
|
||||
|
||||
---
|
||||
|
||||
## 未来插件规划
|
||||
|
||||
### Phase 2 独立插件
|
||||
- render - 3D 渲染引擎(独立)
|
||||
- ai_voice - AI 语音识别(独立)
|
||||
- ai_tts - AI 语音合成(独立)
|
||||
|
||||
### Phase 2 依赖插件
|
||||
- vr - VR 输出(依赖 render 或 video)
|
||||
- ar - AR 输出(依赖 render 或 video)
|
||||
- ai_assistant - AI 助手(依赖 ai_voice + ai_tts + video)
|
||||
|
||||
### Phase 3 依赖插件
|
||||
- cloud_sync - 云端同步(依赖 http)
|
||||
- social - 社交分享(依赖 http + cloud_sync)
|
||||
- editor - 内容编辑器(依赖 video + render)
|
||||
|
||||
---
|
||||
|
||||
## 设计原则
|
||||
|
||||
### 1. 最小依赖原则
|
||||
- 尽量设计独立插件
|
||||
- 依赖关系要有明确的业务理由
|
||||
- 避免过度依赖
|
||||
|
||||
### 2. 单向依赖原则
|
||||
- 依赖关系必须是单向的
|
||||
- 禁止循环依赖
|
||||
- 依赖层级不超过 3层
|
||||
|
||||
### 3. 松耦合原则
|
||||
- 通过消息通信,不直接调用
|
||||
- 依赖插件可以缺失(降级运行)
|
||||
- 依赖插件可以替换(接口兼容)
|
||||
|
||||
### 4. 可测试原则
|
||||
- 依赖插件可以 mock
|
||||
- 独立插件可以单独测试
|
||||
- 依赖插件可以集成测试
|
||||
|
||||
---
|
||||
|
||||
## 实现任务
|
||||
|
||||
### 架构团队任务
|
||||
1. 扩展 Plugin trait,添加 dependencies() 方法
|
||||
2. 实现 ServiceManager 依赖检查和拓扑排序
|
||||
3. 编写技术设计文档
|
||||
|
||||
### 开发团队任务
|
||||
1. 为现有插件添加 dependencies() 实现
|
||||
2. 测试启动顺序是否正确
|
||||
3. 验证消息通信是否正常
|
||||
|
||||
### 产品团队任务
|
||||
1. 梳理 Phase 2/3 插件的依赖关系
|
||||
2. 确认依赖关系的业务合理性
|
||||
3. 编写插件依赖的 PRD
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0
|
||||
**最后更新**: 2026-03-12
|
||||
**负责人**: 陈逸飞 (CEO)
|
||||
48
TEAM_CHAT.md
48
TEAM_CHAT.md
@@ -124,6 +124,54 @@
|
||||
|
||||
---
|
||||
|
||||
[当前] 陈逸飞(CEO) → 全体: **插件依赖模型定义**
|
||||
|
||||
我刚完成了插件依赖模型的设计,请所有团队阅读 PLUGIN_DEPENDENCY.md。
|
||||
|
||||
**核心概念**:
|
||||
1. **独立插件**: 只依赖 core,可独立运行(screen, wifi, video)
|
||||
2. **依赖插件**: 依赖其他插件(ble 依赖 wifi, http 依赖 video)
|
||||
3. **依赖声明**: Plugin trait 新增 dependencies() 方法
|
||||
4. **启动顺序**: ServiceManager 拓扑排序,按依赖关系启动
|
||||
|
||||
**三个团队任务**:
|
||||
|
||||
[当前] 陈逸飞(CEO) → 张婉琳(产品):
|
||||
任务:梳理 Phase 1/2/3 所有插件的功能和依赖关系
|
||||
- 阅读 PLUGIN_DEPENDENCY.md
|
||||
- 确认当前插件分类是否合理
|
||||
- 规划 Phase 2/3 新插件的依赖关系
|
||||
- 输出:更新 PRD.md,包含插件依赖说明
|
||||
- 与架构师王思远、需求分析师李明哲协作
|
||||
|
||||
[当前] 陈逸飞(CEO) → 王思远(架构师):
|
||||
任务:设计插件依赖机制的技术实现
|
||||
- 阅读 PLUGIN_DEPENDENCY.md
|
||||
- 扩展 Plugin trait,添加 dependencies() 方法
|
||||
- 设计 ServiceManager 依赖检查和拓扑排序算法
|
||||
- 设计循环依赖检测机制
|
||||
- 输出:技术设计文档 TECH_DESIGN_PLUGIN_DEPENDENCY.md
|
||||
- 与产品张婉琳、PM 刘建国协作
|
||||
|
||||
[当前] 陈逸飞(CEO) → 刘建国(PM):
|
||||
任务:组织开发团队梳理现有插件依赖
|
||||
- 阅读 PLUGIN_DEPENDENCY.md
|
||||
- 让开发团队为现有 5个插件添加 dependencies() 实现
|
||||
- 验证启动顺序和消息通信
|
||||
- 输出:更新代码,在 TEAM_CHAT.md 记录梳理结果
|
||||
- 与架构师王思远协作
|
||||
|
||||
**评审机制**:
|
||||
三个团队完成后,进行交叉评审:
|
||||
1. 产品团队评审架构设计是否满足业务需求
|
||||
2. 架构团队评审产品规划的技术可行性
|
||||
3. 开发团队评审架构设计的实现难度
|
||||
4. 最终由我(CEO)确认方案
|
||||
|
||||
请三个团队并行工作,完成后在 TEAM_CHAT.md 互相通知。
|
||||
|
||||
---
|
||||
|
||||
## 沟通规则
|
||||
1. 需要其他成员提供的类型/接口信息,在此留言
|
||||
2. 发现 bug 或设计问题,在此记录
|
||||
|
||||
Reference in New Issue
Block a user