crates/、src-tauri/)加 React + TypeScript 前端(src/),两套工具链都要装。
前置条件
Linux(与 CI 一样以 Ubuntu 22.04 为例)需要的系统包:
rustup target add wasm32-wasip2:构建插件和插件 SDK(plugins/build.sh)。cargo install cargo-nextest:CI 使用的测试运行器(直接cargo test也可以)。- 某个语言的语言服务器、调试器和工具链:跑它的冒烟测试时需要。
java/ 下的 Java 扩展包以 jar 形式提交在仓库里,构建时直接嵌入。
克隆并运行
1
克隆
sh git clone https://github.com/l0ng-ai/openidea.git cd openidea 2
安装前端依赖
sh pnpm install 这一步同时会装好 pre-commit 钩子(simple-git-hooks + lint-staged),提交时对暂存文件运行
oxlint --fix、oxfmt 和 rustfmt。3
启动应用
sh pnpm tauri dev 第一次是整个 workspace 的完整 debug 构建,要几分钟。之后是增量构建;前端改动通过 Vite
热更新,不用重新编译。pnpm dev:app 与 pnpm tauri dev 相同,只是额外开启全局 Tauri API(window.__TAURI__,来自 src-tauri/tauri.dev.conf.json),用脚本驱动应用时比较方便。
其他常用命令:
Worktree
可以同时开发和运行多个 worktree。每个任务建一个:pnpm tauri dev / pnpm dev:app 启动,不要直接用 pnpm exec tauri dev。包装脚本(scripts/tauri.ts)会:
- 按 worktree 路径算出 Vite 端口(被占用就顺延),再把实际地址传给 Tauri;
- 同一个 worktree 已有启动器在运行时不再启动第二个,而是打印现有会话;
- 让每个 worktree 的 debug 构建有独立的应用标识(
ai.l0ng.openidea.dev.w<hash>),数据、设置、日志和单实例锁互不干扰。不同 worktree 与已安装的正式版可以同时运行。
--release 使用正式版标识,不经过包装脚本。
worktree 用完后:停掉它的应用和开发会话,删掉构建产物(target/),再 git worktree remove ../my-task。
MCP bridge 与端口
debug 构建会加载 Tauri MCP bridge 插件(tauri-plugin-mcp-bridge,只绑定 127.0.0.1),工具和 agent 可以借此驱动正在运行的应用。release 构建不包含它。
bridge 端口是动态的,范围 9223–9322。查当前 worktree 的端口:
port、appIdentifier)。连接这个端口并显式传 appIdentifier,不要默认 MCP 会话就是自己 worktree 的。找不到 bridge 说明应用还在编译或没有运行。
常见问题
- 只跑部分前端测试:用
pnpm vitest run <path>。pnpm test -- <path>会忽略过滤条件跑完整套件,要好几分钟。 - 边改边跑 clippy:没必要,
pnpm tauri dev本来就会编译。提交前运行一次cargo fmt --all和cargo clippy -p <crate> --all-targets -- -D warnings即可。clippy 通过并不会让首次启动更快,pnpm tauri dev仍然要完整 debug 构建。 - 一条 shell 命令里串起多个长检查:冷缓存构建约 5 分钟,长检查逐个跑,不要串在一起。
- 启动时
src/bindings.ts被改了:每次 debug 启动都会重新导出绑定(内容不同才写文件)。改了 IPC 类型就把重新生成的文件一起提交,过期的话 CI 会失败。 - 停止进程:只停自己这个 worktree 启动的进程。不要用
pkill openidea这种按进程名批量杀的方式,会误伤其他 worktree 和已安装的应用。 - 直接用 Tauri CLI:
pnpm exec tauri dev绕过了上面的 worktree 隔离,可能与其他 worktree 的 Vite 端口或应用标识冲突。