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_sizemin_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 固定到桌面的方案,这个路线值得试试。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐