AionUi 开发环境搭建与多进程工程实践:从 AionCore 后端到 Electron 桌面端完整指南
【免费下载链接】AionUiOpen-source 24/7 Cowork app for OpenClaw, Hermes, Claude Code, Codex, OpenCode and 20+ more CLI Agent | Customize your assistants | Team them up|Star if you like it!项目地址: https://gitcode.com/GitHub_Trending/ai/AionUi
本指南面向希望在 AionUi 仓库中搭建本地开发环境、理解前后端联动机制并参与开发的工程师。AionUi 是一个开源的 24/7 AI 协作桌面应用,它把 OpenClaw、Claude Code、Codex、OpenCode 等 20+ 种 CLI Agent 封装为现代化聊天界面。读完本文,你将掌握:双仓库(AionCore + AionUi)的构建与启动流程、后端二进制从
PATH被发现到被 Electron 自动拉起的完整链路、开发/构建/测试/调试全套脚本的用途、多实例并行开发的隔离机制,以及 prek 代码检查与 electron-vite 构建系统的工程约定。文中所有结论均可在仓库的 docs/contributing/development.md 与对应源码中逐一验证。
一、前置依赖与平台要求
在开始之前,请确保开发机满足以下工具链要求(均以本仓库 docs/contributing/development.md 描述为准):
| 依赖 | 版本要求 | 用途 |
|---|---|---|
| Node.js | 22 或更高 | 运行构建工具链(仓库package.json中engines声明为>=22 <25) |
| bun | 最新稳定版 | 包管理器与运行时,所有脚本均通过bun run驱动 |
| Rust stable + Cargo | 最新稳定版 | 编译本地 AionCore 后端二进制 |
| Python | 3.11+ | 用于原生模块编译 |
| prek | 最新稳定版(npm install -g @j178/prek) | PR 代码检查工具(pre-commit 的 Rust 实现) |
Windows 用户特别注意:需要使用 Rust MSVC 工具链;若 Rust 编译因缺少原生构建工具而失败,请从 Visual Studio Installer 安装Microsoft C++ Build Tools,然后重新打开终端再编译。
依赖安装方式请参考 bun、rustup 等工具的官方安装文档(安装包均已在上表列出)。安装完成后,可以用bun --version、rustc --version、python3 --version快速自检。
二、双仓库布局:AionCore 与 AionUi 的分工
AionUi 的开发依赖两个仓库协同工作,这是理解整个开发流程的关键:
- AionCore:负责构建本地后端二进制,macOS/Linux 上为
aioncore,Windows 上为aioncore.exe。它承载 SQLite 数据库、API 服务、Agent 进程管理等后端能力。 - AionUi:启动 Electron 桌面应用,并在启动时自动拉起后端二进制。
官方建议将两个仓库并排放在同一工作目录下:
workspace/ |-- AionCore/ `-- AionUi/桌面开发服务器通过bun run start继承的PATH来解析后端二进制。因此必须先安装 AionCore 并验证二进制在当前终端可见,再启动 AionUi,顺序不能颠倒。
三、快速开始:完整构建与启动流程
3.1 克隆两个仓库
git clone <AionCore 仓库地址> git clone <AionUi 仓库地址>两个仓库默认使用
main分支,除非维护者明确要求测试其他分支。
3.2 构建并安装 AionCore
在AionCore 仓库目录内执行以下命令。
macOS / Linux:
cd AionCore cargo clean cargo install --path crates/aionui-app --locked # 如需让 Cargo 安装的二进制对当前 shell 可见 export PATH="$HOME/.cargo/bin:$PATH" # 验证 AionUi 能找到后端 which aioncore aioncore --help如果which aioncore没有输出,请将export PATH="$HOME/.cargo/bin:$PATH"追加到你的 shell 配置文件(~/.zshrc、~/.bashrc或等效文件),新开终端后再次验证。
Windows PowerShell:
cd AionCore cargo clean cargo install --path crates/aionui-app --locked # 如需让 Cargo 安装的二进制对当前 PowerShell 会话可见 $env:Path = "$env:USERPROFILE\.cargo\bin;$env:Path" # 验证 AionUi 能找到后端 where.exe aioncore aioncore --help如果where.exe aioncore没有输出,请确认%USERPROFILE%\.cargo\bin已在用户Path环境变量中,新开 PowerShell 窗口后再次验证。
3.3 启动 AionUi
在AionUi 仓库目录、且aioncore可见的终端中执行:
cd AionUi # 安装依赖 bun install # 以开发模式启动 Electron 桌面应用 bun run start启动过程中,AionUi 会自动拉起aioncore并把后端端口传给渲染进程——你不需要在另一个终端单独启动 AionCore。
3.4 源码视角:Electron 如何"接管"后端进程
从源码可以还原这条自动拉起链路的实现细节。入口脚本 scripts/webui.ts 与 packages/web-host/src/backend-launcher.ts 共同构成了后端进程的生命周期管理:
- 二进制解析:优先使用
AIONUI_BACKEND_BIN环境变量指定的绝对路径;其次查找resources/bundled-aioncore/<platform>-<arch>/下的内置二进制;最后通过which/where在PATH中查找。三种方式都失败时抛出Cannot find "aioncore"错误。 - 启动参数:buildSpawnArgs 会拼接
--port、--data-dir、--parent-pid、--log-level、--app-version等参数,并在打包场景追加--managed-resources-mode bundled。开发模式下还会注入AIONUI_CACHE_DIR、AIONUI_WORK_DIR、AIONUI_LOG_DIR三个环境变量,保证后端/api/system/info报告的系统目录与 Electron 主进程持久化的一致。 - 就绪探测:后端启动后,launcher 监听 stdout 上的
AIONCORE_LISTENING <json>(端口上报)与AIONCORE_READY(权威就绪标记)两行输出,同时以 200ms 间隔轮询http://127.0.0.1:<port>/health(默认 30 秒超时),"就绪标记"与"健康检查"谁先到达谁胜出,避免误判慢启动。 - 端口选择:findAvailablePort 会避开一批 fetch 禁止端口(如 22、25、53 等),最多尝试 50 次,确保后端端口可被渲染进程正常访问。
这也是为什么开发文档反复强调"同一终端、PATH 一致"——后端二进制查找完全依赖启动 AionUi 时继承的环境。
四、更新本地后端:--force的正确用法
当你拉取或修改 AionCore 后,需要重装后端二进制并重启 AionUi:
cd ../AionCore cargo install --path crates/aionui-app --locked --force cd ../AionUi bun run start关键点:当以相同AionCore 包版本重建本地改动时,必须使用--force,否则 Cargo 可能保留已安装的旧二进制。
五、后端启动故障排查手册
5.1Cannot find "aioncore" binary
AionUi 无法从bun run start继承的PATH中找到后端。请在启动 AionUi 的同一终端中检查:
# macOS / Linux which aioncore # Windows PowerShell where.exe aioncore命令失败则把 Cargo 二进制目录加入PATH,然后新开终端再启动。
5.2 终端里aioncore可用,但 AionUi 仍找不到
请确保bun run start是在能执行aioncore --help的同一个终端环境中启动的。IDE 内置终端与 GUI 启动的 shell 可能继承不同的PATH;更新PATH后请重启 IDE,或从终端启动 IDE。
5.3 后端改动不生效
退出 AionUi,用cargo install --path crates/aionui-app --locked --force重装 AionCore,再重新启动 AionUi。开发期间 Electron 应用持有后端子进程,运行中的 AionUi 实例不会拾取新安装的二进制,必须重启。
5.4 Windows Rust 编译错误
使用 Rust MSVC 工具链并安装 Microsoft C++ Build Tools;安装或切换工具链后,新开 PowerShell 窗口重新执行 AionCore 安装命令。
六、脚本参考大全(与 package.json 逐条对应)
以下所有命令均在仓库根 package.json 的scripts字段中定义,按用途分组说明。
6.1 开发类
| 命令 | 说明 |
|---|---|
bun start | 以开发模式启动 Electron 应用(桌面) |
bun run start:multi | 在已有实例旁启动第二个 Electron 实例(见第七节多实例开发) |
bun run cli | bun start的别名 |
bun run webui | 以 WebUI 模式启动(浏览器访问,无 Electron 窗口) |
bun run webui:remote | 以 WebUI 模式启动并开启远程访问 |
bun run webui:prod | 以生产模式启动 WebUI |
bun run webui:prod:remote | 以生产模式启动 WebUI 并开启远程访问 |
bun run resetpass | 通过 CLI 重置用户密码 |
其中 WebUI 系列由纯 Bun CLI scripts/webui.ts 实现——它不启动 Electron,而是"后端 + 静态服务器 + 认证"三者合一。该脚本暴露了完整的可调环境变量:AIONUI_PORT(静态服务器端口,默认开发 25809)、AIONUI_HOST(监听地址,设为0.0.0.0等价于开启--remote)、AIONUI_ALLOW_REMOTE、AIONUI_DATA_DIR、AIONUI_LOG_DIR、AIONUI_STATIC_DIR、AIONUI_BACKEND_BIN、AIONUI_OPEN_BROWSER等。
值得留意的是 WebUI 的数据目录隔离设计:脚本默认把数据放在~/.aionui-web(生产)或~/.aionui-web-dev(开发),而不是 Electron 使用的~/.aionui[-dev]。原因在源码注释中有详细说明——macOS 上 Electron 会把~/.aionui-dev创建为指向~/Library/Application Support/AionUi-Dev/aionui的符号链接,若 WebUI 抢先占用了该位置作为真实目录,会导致之后安装的 Electron 无法建立 CLI 安全符号链接,进而让桌面应用内所有 ACP Agent 的 CLI 命令全部失败。
6.2 构建与分发类
| 命令 | 说明 |
|---|---|
bun run package | 构建全部进程(main、preload、renderer)到out/ |
bun run make | bun run package的别名 |
bun run dist | 构建并打包当前平台的发行版 |
bun run dist:mac/dist:win/dist:linux | 分别打包 macOS / Windows / Linux |
bun run build-mac | 同时构建 macOS arm64 与 x64 发行版 |
bun run build-mac:arm64 | 仅构建 Apple Silicon 发行版 |
bun run build-mac:x64 | 仅构建 Intel 发行版 |
bun run build-win | 构建 Windows 发行版 |
bun run build-win:arm64/build-win:x64 | 构建 Windows ARM64 / x64 发行版 |
bun run build-deb | 构建 Linux(.deb)发行版 |
bun run build | bun run build-mac的别名 |
6.3 独立服务器类(非 Electron)
| 命令 | 说明 |
|---|---|
bun run build:renderer:web | 为独立 Web 部署构建渲染进程 |
bun run build:server | 构建独立服务器 bundle 到dist-server/ |
bun run server:start | 以开发模式运行独立服务器 |
bun run server:start:remote | 以远程访问模式运行独立服务器 |
bun run server:start:prod | 以生产模式运行独立服务器 |
bun run server:start:prod:remote | 以生产 + 远程访问模式运行独立服务器 |
bun run server:resetpass/server:resetpass:prod | 通过独立服务器 CLI 重置密码(普通 / 生产) |
6.4 代码质量类
| 命令 | 说明 |
|---|---|
bun run lint | 检查 lint 问题(oxlint,只读) |
bun run lint:fix | 自动修复 lint 问题 |
bun run format | 自动格式化代码(oxfmt) |
bun run format:check | 仅检查格式、不修改文件 |
bun run i18n:types | 为 i18n 键生成 TypeScript 类型 |
6.5 测试类
| 命令 | 说明 |
|---|---|
bun run test | 运行全部单元测试(vitest) |
bun run test:watch | 监听模式运行测试 |
bun run test:coverage | 带覆盖率报告运行测试 |
bun run test:contract | 运行契约测试 |
bun run test:integration | 运行集成测试 |
bun run test:bun | 运行 Bun 专属数据库驱动测试 |
bun run test:e2e | 运行端到端测试(Playwright,配置见 playwright.config.ts) |
bun run test:packaged:i18n | 针对打包构建运行 i18n 集成测试 |
bun run test:packaged:bun | 运行 Bun 打包集成测试 |
6.6 调试类
| 命令 | 说明 |
|---|---|
bun run debug:perf | 开启性能监控启动应用 |
bun run debug:perf:report | 根据收集数据生成性能报告 |
bun run debug:mcp | 调试 MCP 服务器连接 |
bun run debug:mcp:list | 列出已配置的 MCP 服务器 |
bun run debug:mcp:validate | 校验 MCP 服务器配置 |
bun run debug:custom-agent | 调试自定义 Agent 连接 |
七、多实例开发:start:multi的隔离机制
当你拥有两个仓库克隆(例如AionUi与AionUi-refactor)并需要同时运行时,第二个实例用以下命令启动:
bun run start:multi该命令本质是设置AIONUI_MULTI_INSTANCE=1后启动 electron-vite(见 package.json 中start:multi的定义),其隔离效果包括:
- 跳过 Electron 单实例锁,允许多个窗口并存;
- 使用独立的 userData 目录(
AionUi-Dev-2),避免数据库与配置冲突; - 隔离数据/配置符号链接路径(
~/.aionui-dev-2、~/.aionui-config-dev-2); - Vite 渲染进程、CDP、WebUI 代理端口自动递增,避免端口占用碰撞。
端口约定在 packages/desktop/src/common/config/constants.ts 中可查:生产 25808、开发 25809、多实例开发 25810。scripts/webui.ts中DEFAULT_PORT的计算逻辑与之完全对齐(NODE_ENV=production→ 25808,AIONUI_MULTI_INSTANCE=1→ 25810,否则 25809)。
重要提示:多实例的 WebUI 默认端口是 25810(而非 25809)。在浏览器访问第二个实例的 WebUI 时,请使用无痕/隐私窗口——两个实例共享
localhost的 cookie,而 JWT 密钥不同,复用同一浏览器会话会导致认证失败。
八、代码检查:prek(pre-commit 的 Rust 实现)
项目使用 prek,该配置被设计为"本地检查与 CI 检查完全一致"。
# 安装 prek npm install -g @j178/prek # 安装 git hooks(可选,提交前自动检查) prek install # 对暂存文件运行检查 prek run # 对 main 分支以来的改动运行检查(与 CI 一致) prek run --from-ref origin/main --to-ref HEAD从 .pre-commit-config.yaml 可以看到完整的检查链:
- 通用文件检查(pre-commit-hooks v5.0.0):YAML/JSON/TOML 语法、合并冲突、大小写冲突、大文件(>1000KB 报错)、文件末尾换行、行尾空白(均排除二进制与特殊系统文件);
- TypeScript 类型检查:
bunx tsc --noEmit,全项目检查(pass_filenames: false); - Oxlint:
bun run lint,仅检查暂存文件(取代 ESLint); - Oxfmt:
bun run format,自动修复暂存文件格式(取代 Prettier); - i18n 校验:
node scripts/check-i18n.js,针对packages/desktop/src/renderer/services/i18n/locales/下的翻译文件; - 提交信息规范:conventional-pre-commit v4.2.0,
--strict --force-scope,允许类型为feat/fix/docs/style/refactor/perf/test/build/ci/chore/revert,作用于commit-msg阶段。
九、构建系统:electron-vite 与三层产物
AionUi 使用electron-vite进行快速打包(配置文件为 packages/desktop/electron.vite.config.ts),三个进程分别处理:
- Main 进程:Vite 打包(ESM),入口为
packages/desktop/src/index.ts,通过externalizeDepsPlugin外部化依赖(fix-path与@aionui/web-host例外,需内联打包); - Renderer 进程:Vite 打包(React + TypeScript),root 为
packages/desktop/src/renderer,采用 MPA 模式(appType: 'mpa'),入口包括主界面index.html与宠物模块的多个pet*.html; - Preload 脚本:Vite 打包,入口为
packages/desktop/src/preload/main.ts及宠物相关 preload。
构建产物输出到out/目录:
out/ ├── main/ # Main 进程代码 ├── renderer/ # Renderer 进程代码 └── preload/ # Preload 脚本配置文件还体现了几个值得注意的工程决策:
- 版本号只信任根 package.json:
packages/desktop/package.json是 workspace 内部占位文件(恒为0.0.0),用户可见版本统一从根package.json读取,并通过__APP_VERSION__注入渲染进程; - 依赖去重:为规避 CodeMirror 单例失效问题,对
react、react-dom、@codemirror/*等包做dedupe,确保语法高亮 facet 注册生效; - 单 vendor chunk:React 及与其强耦合的 Arco Design、markdown 解析链、编辑器等被打入同一个
vendorchunk,避免历史上因 chunk 循环 ESM 依赖导致的白屏问题; - HMR 直连:dev server 默认端口 5173,HMR host 显式设为
localhost,避免 WebSocket 误走 WebUI 代理造成无限刷新; - Sentry 源映射:非开发环境且配置了
SENTRY_AUTH_TOKEN时启用,上传后自动删除out/**/*.map。
十、技术栈一览
| 技术 | 用途 |
|---|---|
| Electron | 跨平台桌面框架(package.json中electron ^37.x) |
| React 19 | UI 框架 |
| TypeScript | 类型安全(全仓统一tsconfig.json) |
| Vite(经 electron-vite) | 快速打包器 |
| UnoCSS | 原子化 CSS 引擎(配置见 uno.config.ts) |
| better-sqlite3 | 本地数据库(^12.x) |
| vitest | 测试框架(配置见 vitest.config.ts) |
十一、进阶:编码规范与仓库结构速览
开发指南之外,仓库还有一份配套的 docs/contributing/file-structure.md,它定义了整个 Electron 项目的目录与文件组织规则,与本文的工程实践直接相关:
- 三层进程边界:
src/renderer/(React UI,禁止 Node.js API)、src/process/(主进程,全部 Node.js/Electron 业务)、src/common/(跨进程共享层),跨进程通信必须走preload.ts+src/process/bridge/*.ts的 IPC 通道; - 目录命名双轨制:渲染进程内的组件/功能模块目录用 PascalCase,其余(分类目录、平台目录如
acp/、gemini/)一律小写; - 测试文件镜像映射:测试必须与源码一一对应(如
CronService.ts→tests/unit/cronService.test.ts),且tests/unit/超过 10 个直接子项后要按源码结构分子目录; - 目录规模上限:单个目录直接子项不得超过 10 个,接近上限时按职责拆分。
结合本指南的 development.md 与 file-structure.md 两篇文档,你可以完整走通"环境搭建 → 双仓库构建 → 启动调试 → 编码规范 → 提交检查"的整条开发链路。
【免费下载链接】AionUiOpen-source 24/7 Cowork app for OpenClaw, Hermes, Claude Code, Codex, OpenCode and 20+ more CLI Agent | Customize your assistants | Team them up|Star if you like it!项目地址: https://gitcode.com/GitHub_Trending/ai/AionUi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考