项目背景
MoodPet 容器只做三件事:加载 Friend 插件、调度 Application 插件、给用户交互界面。所有“有个性”的东西——伙伴叫什么、什么性格、怎么回应你——全在 Friend 插件里。所有“有能力”的东西——TTS、语音识别、额外面板——全在 Application 插件里。
插件是 MoodPet 的核心流通物。用户要能发现、安装、更新插件;开发者要能发布插件。合起来就是一个“插件市场”。
为什么不用传统方案
Section titled “为什么不用传统方案”标准插件市场长这样:
客户端 ──HTTP──▶ API 服务器 ──▶ 数据库 │ └──▶ 对象存储 / CDN ──▶ 插件包对 MoodPet 来说太重了:
- 服务器成本:哪怕最低配 VPS 常年跑也是钱。开源项目没营收。
- 维护负担:API 要升级、要监控、要处理宕机。一个人维护不住。
- 冷启动:没几个用户时专门搭一套基础设施性价比太低。
- 审核:上传审核、版本管理、删除下架——Git + PR 天然就有。
为什么用 GitHub
Section titled “为什么用 GitHub”GitHub 仓库恰好满足一个插件市场的所有需求:
| 需求 | GitHub 提供 |
|---|---|
| 文件存储 | 仓库本身,单文件 100MB 以内 |
| 目录索引 | Contents API 返回目录下文件列表 |
| 文件下载 | raw.githubusercontent.com,CDN 加速,无限速 |
| 版本管理 | Git,每次更新就是一个 commit |
| 审核 | PR review |
| 自动验证 | GitHub Actions |
| 社区协作 | Fork + PR |
目录即索引是核心。friend/ 目录下有 moodpet.friend.default_smiley.meta.json,就说明市场里有一个叫 moodpet.friend.default_smiley 的 Friend。客户端读目录列表就知道有什么,不需要维护 index.json——那种东西迟早和实际文件不同步。
GitHub API 限速:未认证 60 次/小时/IP。目录列表走 API,缓存 5 分钟。一次目录加载 3 次 API 调用(三个目录各一次),一小时刷 20 次才到上限。配了 token 提到 5000 次/小时,基本不用担心。
没有真实下载量统计:.meta.json 里的 downloads 是展示用的虚荣指标。要做真实统计得有后端埋点,那就不“零服务器”了。
单仓库容量:GitHub 仓库软限 5GB。一个插件包 100KB,能存 5 万个。真到了这个量级可以拆仓库或用 Git LFS。
没有搜索:目前靠 Tab 浏览。插件多了再加,可以走 GitHub code search API 或客户端本地过滤。
用“不那么完美”换“零成本零维护”,对开源社区项目来说是划算的买卖。
客户端集成哲学
Section titled “客户端集成哲学”市场层在客户端里只做两件事:
- 从 GitHub 拉数据(
MarketRepository) - 把下载的插件包解压到正确目录(
PluginInstaller),然后让PluginManager重新扫描
市场层不碰插件加载、不碰 enable/disable、不碰 active Friend 状态——那些是 PluginManager 的职责。安装完调一句 pluginManager.refresh(),新插件就出现在系统里了。“只管搬运,不管管理”的边界让市场层可以独立开发。