DeepSeek Harness 桌面端搭建记录,Tauri 2 封装 Web UI 的完整流程
DeepSeek Harness 的 Web UI 默认跑在浏览器里,对日常高频使用来说,多开标签页、误关闭、服务手动启停这些琐事其实挺烦人。把它封装成桌面应用是个不错的思路,而 Tauri 2 正好能在保持轻量的同时提供原生窗口能力。这篇记录一下我基于 Tauri 2 搭建 Harness 桌面端的完整过程,从环境准备到打包产出,尽量把踩过的坑写清楚。
为什么选 Tauri 2 而不是 Electron
一开始也考虑过 Electron,但 Harness 本身已经是 Web 应用,Tauri 2 的架构更贴合这种"套壳"场景。几个实际优势:
- 独立窗口管理:1280×800 的固定窗口,可缩放,不再和浏览器标签混在一起
- 服务自动启停:应用启动时探测 3080 端口,Harness 没跑的话自动拉起,退出时干净停掉
- 构建产物小:最终安装包体积远小于 Electron 方案,内存占用也更友好
- 跨平台打包:同一套源码可出 Windows 的
.exe和 macOS 的.dmg
核心思路很简单:Tauri 负责窗口生命周期和本地服务编排,Harness 的 Web UI 作为远程内容加载进来。
环境准备
这个项目同时需要 Rust 和 Node.js 两套工具链,Windows 下还要额外注意 MSVC 工具链的完整性。
Rust 工具链(MSVC)
Tauri 2 依赖 Rust stable,且必须使用 MSVC 工具链而非 GNU。安装时选默认的 x86_64-pc-windows-msvc 即可。如果之前装过 Rust,确认下当前工具链:
rustup show
看到 stable-x86_64-pc-windows-msvc 就对了。cargo 建议配下国内镜像,USTC 源在编译阶段能省不少时间:
# ~/.cargo/config.toml
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
VS Build Tools 2022
这是 Windows 编译 Tauri 应用的硬性依赖,主要提供 C++ 构建工具和 Windows SDK。从微软官网下载 Build Tools 安装器,工作负载勾选"使用 C++ 的桌面开发"。已经装过 Visual Studio 2022 的,确认下是否包含 MSVC v143 生成器和 Windows 11 SDK 即可。
Node.js
版本没有特别苛刻的要求,LTS 就行。npm 同样建议换国内源:
npm config set registry https://registry.npmmirror.com
项目结构与关键配置
克隆桌面端仓库后,核心文件就这几处:
deepseek-harness-desktop/
├── harness.json # 服务启动配置(随安装包分发)
├── src-tauri/
│ ├── tauri.conf.json # 应用元信息、打包配置
│ └── src/
│ ├── main.rs # 入口
│ └── lib.rs # 配置读取、服务拉起、窗口创建
└── dist/index.html # 前端占位,实际加载外部 URL
harness.json 配置详解
这是整个自动化的核心,放在 exe 同目录,程序启动时优先读取它。一个典型配置:
{
"url": "http://127.0.0.1:3080",
"probeAddr": "127.0.0.1:3080",
"workingDir": "D:/deepseek_harness/deepseek-harness-master",
"command": "node",
"args": [
"--import",
"tsx/esm",
"apps/cli/src/bin.ts",
"web"
],
"startupTimeoutSecs": 60
}
各字段的实际含义:
| 字段 | 作用 | 调整建议 |
|---|---|---|
workingDir |
Harness 源码根目录的绝对路径 | 根据你放 Harness 的位置修改,注意 JSON 里反斜杠要转义成 \\ |
command / args |
启动服务的具体命令 | 如果你用 pnpm dsh web 启动 Harness,这里要对应调整 |
startupTimeoutSecs |
等待服务就绪的最大秒数 | 机械硬盘或老机器建议调到 90–120,SSD 上 60 秒通常够用 |
url / probeAddr |
探测和加载的地址 | 一般保持默认,除非改了 Harness 的启动端口 |
重要:项目根目录的 harness.json 是源文件,修改后需要重新执行 npm run tauri build 才会被打进安装包。安装完成后,直接改安装目录里的 harness.json 即可生效,无需重新编译。
Rust 侧的服务编排逻辑
lib.rs 里的核心流程:启动时先探测 probeAddr 是否可达。如果 Harness 已经在运行,直接加载 Web UI,应用退出时也不碰它;如果没运行,按 command + args 在后台拉起服务,等 url 能响应了再创建窗口,应用退出时只停掉自己拉起来的那个进程。
这个设计很贴心,避免了你手动 pnpm dsh web 启动后,桌面端退出时误杀服务。
构建与打包
依赖装完后,构建命令很直接:
npm install
npm run tauri build
首次构建需要下载编译 Rust 依赖,USTC 镜像下大概 5–15 分钟,取决于网络和设备性能。产物在 src-tauri/target/release/bundle/ 下:
nsis/DeepSeek Harness_0.1.0_x64-setup.exe— 推荐,带安装向导msi/*.msi— 适合企业静默部署
首次构建常见报错
"error: linker link.exe not found"
VS Build Tools 没装或环境变量没生效。重启终端,或者从"Developer Command Prompt for VS 2022"里执行构建。
"failed to run custom build command" 涉及 windows-rs
通常是 Windows SDK 版本不匹配,确保安装了 10.0.19041.0 或更新的 SDK。
Harness 服务拉不起来,窗口显示无法连接
先在普通终端手动跑通 pnpm dsh web,确认 Harness 本身能正常启动。如果手动都起不来,检查 Node.js 版本是否满足 Harness 要求的 v22.19+,以及 workingDir 路径是否正确。
自定义调整
窗口尺寸
改 src-tauri/src/lib.rs 里的 inner_size 和 min_inner_size:
.window_builder(Window::new, "main")
.inner_size(1440.0, 900.0) // 默认打开尺寸
.min_inner_size(1024.0, 768.0) // 最小允许尺寸
图标替换
准备一张 1024×1024 的 PNG,然后:
npm run tauri icon icon.png
会自动生成全套尺寸并替换 src-tauri/icons/ 下的文件。
打包目标精简
如果只需要 NSIS 安装包,不需要 MSI,改 src-tauri/tauri.conf.json:
{
"bundle": {
"targets": ["nsis"]
}
}
构建时间会缩短一些,产物也更干净。
实际使用体验
装好后双击启动,窗口弹出前会有短暂的黑屏或白屏,那是在等 Harness 服务就绪。如果之前已经手动启动了 Harness,这个等待过程几乎感知不到。
退出时观察任务管理器,由桌面端拉起的 Node 进程会被干净清理;而你自己提前开的 pnpm dsh web 不受影响,这个边界处理得很到位。
目前这套方案在我这边 Windows 11 上跑得很稳,macOS 的 .dmg 打包理论上支持,但需要到 macOS 机器上执行,并且补一个 icon.icns 图标文件。
整个项目做下来,Tauri 2 的配置量比想象中少,主要精力反而花在 Harness 本身的启动参数调优上。如果你也在找把 Harness 固定到桌面的方案,这个路线值得试试。
更多推荐

所有评论(0)