Skip to content

项目背景

MoodPet 容器只做三件事:加载 Friend 插件、调度 Application 插件、给用户交互界面。所有“有个性”的东西——伙伴叫什么、什么性格、怎么回应你——全在 Friend 插件里。所有“有能力”的东西——TTS、语音识别、额外面板——全在 Application 插件里。

插件是 MoodPet 的核心流通物。用户要能发现、安装、更新插件;开发者要能发布插件。合起来就是一个“插件市场”。

标准插件市场长这样:

客户端 ──HTTP──▶ API 服务器 ──▶ 数据库
│
└──▶ 对象存储 / CDN ──▶ 插件包

对 MoodPet 来说太重了:

  1. 服务器成本:哪怕最低配 VPS 常年跑也是钱。开源项目没营收。
  2. 维护负担:API 要升级、要监控、要处理宕机。一个人维护不住。
  3. 冷启动:没几个用户时专门搭一套基础设施性价比太低。
  4. 审核:上传审核、版本管理、删除下架——Git + PR 天然就有。

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 或客户端本地过滤。

用“不那么完美”换“零成本零维护”,对开源社区项目来说是划算的买卖。

市场层在客户端里只做两件事:

  1. 从 GitHub 拉数据(MarketRepository)
  2. 把下载的插件包解压到正确目录(PluginInstaller),然后让 PluginManager 重新扫描

市场层不碰插件加载、不碰 enable/disable、不碰 active Friend 状态——那些是 PluginManager 的职责。安装完调一句 pluginManager.refresh(),新插件就出现在系统里了。“只管搬运,不管管理”的边界让市场层可以独立开发。