Innate Executable 与 innate-desktop-mono 共享同一个 Cargo Workspace,但保持独立的 Frontend 构建流程。
innate-desktop-mono/ # Git repo root
├── Cargo.toml # Cargo workspace (共享)
│ ├── members:
│ │ ├── apps/desktop/src-tauri # innate-desktop
│ │ └── apps/innate-executable/
│ │ └── playground/apps/desktop/
│ │ └── src-tauri # innate-playground ← 共享
│ └── [workspace.dependencies] # 公共 Rust 依赖
│
├── .cargo/config.toml # 统一 target-dir = "target"
│
├── target/ # 共享编译产物 (~2GB)
│ ├── debug/
│ └── release/
│
├── apps/desktop/ # Vite + React frontend
│ └── src-tauri/
│
└── apps/innate-executable/
├── package.json # 集成入口脚本
├── Taskfile.yml # 任务管理 (可选)
├── README.md # 集成说明
├── INTEGRATION.md # 集成策略
└── playground/ # 独立 monorepo
├── package.json
├── pnpm-workspace.yaml # 自己的 workspace
├── apps/desktop/ # Next.js frontend (独立)
│ ├── src/ # Next.js App Router
│ └── src-tauri/ # Rust backend (共享 target)
└── packages/
├── ui/ # Radix UI 组件库
├── utils/ # 工具库
└── tsconfig/
Rust 编译产物非常占空间。两个 Tauri 桌面应用如果各自维护 target/,磁盘占用会翻倍。
| 方案 | 磁盘占用 | 说明 |
|---|---|---|
| 独立 target | ~4GB (2×2GB) | 每个项目各自编译 |
| 共享 target | ~2GB | 公共 crate 只编译一次 |
配置方式:
-
根目录
.cargo/config.toml设置全局 target 目录:[build] target-dir = "target"
-
根目录
Cargo.toml注册两个 workspace member:[workspace] members = [ "apps/desktop/src-tauri", "apps/innate-executable/playground/apps/desktop/src-tauri", ]
-
innate-playground的Cargo.toml使用 workspace 依赖:[dependencies] serde_json = { workspace = true } serde = { workspace = true } log = { workspace = true } tauri = { workspace = true }
Frontend 不共享,原因:
- 框架不同:innate-desktop 用 Vite + React,innate-playground 用 Next.js
- 组件库不同:innate-desktop 用 Base UI,innate-playground 用 Radix UI
- 路由方式不同:Vite 是 SPA,Next.js 是文件路由 + App Router
- 构建产物不同:Vite →
dist/,Next.js →out/
强行统一 Frontend 会导致大量重构,收益远低于成本。
# 从 repo root
cd apps/innate-executable
# 查看可用任务
cd playground/apps/desktop && task --list-all
# 启动开发(Next.js + Tauri,共享 target)
task dev
# 完整构建
task default
# 仅构建前端
task build-frontend
# 仅构建 Tauri
task build-tauri# 进入 playground 子目录
cd apps/innate-executable/playground
# 独立安装依赖
pnpm install
# 启动 Next.js(仅前端)
pnpm dev
# 启动 Tauri(带 Rust 后端)
pnpm --filter desktop tauri dev注意:独立运行时,如果根目录没有 target/,Cargo 会在 playground/apps/desktop/src-tauri/target/ 创建新的 target 目录。为避免这种情况,建议始终从 repo root 运行,或手动设置 CARGO_TARGET_DIR:
export CARGO_TARGET_DIR="$(pwd)/../../../target"不会。Cargo workspace 中每个 crate 有独立的 name 和输出文件名:
apps/desktop/src-tauri→ crate name:innate_desktopapps/innate-executable/.../src-tauri→ crate name:innate-playground
编译产物在 target/ 中按 crate 名称分目录存放。
会,但这是设计意图。Workspace 统一管理 serde、tauri 等公共依赖的版本,确保两个 Tauri 应用使用兼容的 Rust crate 版本。
如果 innate-playground 需要特定版本的依赖(如 tauri-plugin-log),可以在其 Cargo.toml 中保留独立版本:
tauri-plugin-log = "2" # 不在 workspace.dependencies 中,独立指定# 从 repo root
cargo clean
# 这会清理整个 target/ 目录,影响两个项目如果只想清理一个项目:
# 清理 innate-desktop 的编译产物
cargo clean -p innate_desktop
# 清理 innate-playground 的编译产物
cargo clean -p innate-playground