03-无需编写Rust!手把手带你将DSH一键打包成专属品牌的Windows桌面端
无需编写 Rust!手把手带你将 DSH 一键打包成专属品牌的 Windows 桌面客户端
将 DeepSeek 官方开源的 DeepSeek-Harness (dsh) 部署在本地进行 AI 对话或编程开发确实好用。然而,如果你打算将这一成果大规模分发给付费用户、大客户或培训班学员,问题便接踵而至:你不可能要求每个非技术用户都在自己的电脑上安装 Node.js、配置 Git、拉取命令行并热启动 Web 服务。
要跨越这最后一步,我们需要将 DSH 打包成一个像 Cursor 或微信那样,双击即可运行、内置便携式免配置运行时、且带有简体中文安装向导的专属品牌桌面客户端(.exe 安装包)。
今天,我们就从前端 React 标题栏劫持、Tauri 核心配置文件动态覆写、以及内嵌便携运行时(Portable Vendor)的源码级角度,拆解开源项目 jingyun-dsh 内置的一键打包控制台机制,教大家如何在不写一行 Rust 代码的前提下,打包出完全属于自己品牌的客户端。
⚙️ 一、原理篇:解构 Tauri 沉浸式窗口与内嵌运行时的打包黑幕
要想实现纯白标(无任何开发水印)并且不依赖用户系统 Node 跑起来,底层有以下几个关键技术点需要打通:
大部分 Python 构建脚本往往会采用 Tkinter 或 PyQt 来开发打包控制面板,但这不仅让界面看起来十分简陋,还会因为跨平台像素渲染差异而出现布局错乱。
在 jingyun-dsh 中,打包控制台脚本 scripts/pack_gui.py 采用了更优雅的 Web-Server 桥接模式:
脚本底层通过 Python 自带的轻量级 SimpleHTTPRequestHandler 在本地热启一个 HTTP 服务器,并自动拉起默认浏览器,向用户展示一个带有磨砂深色磨砂质感、Outfit 字体以及实时绿色 Terminal 日志面板的高阶 Web 交互界面。
当用户在浏览器里输入参数并点击“开始打包”时,网页向后端发送 POST /api/build,由 Python 主线程启动一个异步 Thread 调用 Tauri,并实时推送构建 stdout 到 Web 端,提供极致的极客开发体验。
为了防止繁琐的手动配置文件修改,Python 后端在接收到构建请求后,会自动定位并改写 src-tauri/tauri.conf.json 以及中台 jingyun-config.json 配置文件中的底层参数。
A. 核心字段覆写
自动覆写 productName、identifier(Bundle 包名,如 com.jingyun.dstudio)以及版本号。
B. 接管原生窗口控制权:无边框(Decorations=false)设计
在传统的桌面软件中,Windows 默认的白色窗口标题栏会极大地割裂界面美感,因此,打包控制台会将所有窗口的 decorations 统一改写为 false:
json{ "decorations": false, "maximized": true, "url": "index.html"} |
|---|
技术机制说明:由于去掉了 Windows 原生的关闭、最小化和顶栏拖拽条,插件前端(基于 React)会相应地在页面头部挂载 JYTopDragBar 和 JYWindowControls 组件,通过 Tauri API 拦截用户的鼠标坐标,直接接管窗口的原生拖动与缩放,从而实现沉浸式的软件体验。
为什么打包出来的 .exe 可以在一台完全没有安装 Node.js、Python 和 Git 的新电脑上无缝运行 DSH 实例?这得益于其独特的 Portable Vendor(便携式运行时包) 机制。
在打包执行时,Python 后端会自动运行 node scripts/prepare_vendor.js。该构建脚本会将 Node.js、Git 的便携免安装版本在后台增量解压,并同步灌入到项目的 src-tauri/resources/vendor/ 目录下:
python# scripts/pack_gui.py 底层执行片段pnpm_cmd = "pnpm.cmd build" if sys.platform == "win32" else "pnpm build"subprocess.run(pnpm_cmd, shell=True, cwd=base_dir, check=False)zip_cmd = "node scripts/prepare_vendor.js"subprocess.run(zip_cmd, shell=True, cwd=base_dir, check=False) |
|---|
当 Tauri 执行 tauri:build 时,这些内嵌的运行时包会被整体编译进生成的客户端包结构中。当软件在用户电脑上启动时,Tauri 主进程(Rust)会自动释放并挂载这些便携包的环境变量,从而实现在任何机器上的“免配置”无痛起航。
在生成 Windows 安装向导时,系统需要抹去原生的水印信息。
构建脚本在改写配置文件时,会强行向 nsis 属性下灌入语言重写,将安装界面强制限定为 简体中文:
json"windows": { "nsis": { "installerIcon": "icons_generated/icon.ico", "template": "installer.nsi", "languages": ["SimpChinese"] }} |
|---|
同时会自动剔除默认打包中容易暴露底层痕迹的 headerImage(头部图)和 sidebarImage(侧栏图),以保证打包出的客户端从安装到启动呈现出纯净的白标品质。
🏪 二、实战篇:3步一键打包你的专属桌面客户端
理解了以上的构建原理,我们马上在 Windows 电脑下进行一键打包。
步骤一:环境前置与便携环境包拉取
安装构建工具:
Node.js >= 18.x
pnpm >= 8.x
Rust (stable) 及 cargo(编译 Tauri 原生 Rust 壳必须)
Python >= 3.8
获取内嵌运行时包: 由于 Node/Git/Python 的 Windows 便携版包体积较大,不包含在 Git 基础仓库中,你可以从官方社群中获取,并解压存放在项目的 src-tauri/resources/vendor/ 路径下,以确保编译依赖完整。
步骤二:启动打包控制台
拉取源码与安装依赖
bashgit clone https://github.com/jingyunstudio/jingyun-dsh.gitcd jingyun_dshpnpm install |
|---|
热启动 GUI 打包控制台 直接双击运行根目录下的 run_pack.bat 脚本(或者在终端执行 python scripts/pack_gui.py)。 系统会在本地 8080 端口开启打包服务,并自动弹出你的浏览器窗口展示构建页面。
步骤三:参数配置与一键构建
表单参数配置 在打开的打包控制台页面上,填入以下专属信息:
应用名称 (App Name):例如:天马AI助手。
应用包名 (Bundle ID):例如:com.tianma.aihelper。
应用 Logo 图标:点击右侧按钮选择你设计好的 .ico 或 .png 图标文件,打包控制台会自动生成不同尺寸的自适应图标包。
SaaS 服务地址 (API URL):井云智能体商业化系统(Jingyun Studio V2.0) 中台为你提供的后端 API 地址。
租户 Key (Tenant Host) 与 客户端加载域名 (Domain URL):你绑定在后台的独立域名。
(注:极客 Terminal 终端控制台会显示在表单下方)
执行打包 配置完成后,点击“开始一键打包生成客户端 (.exe)”按钮。 底层的构建管线将被自动触发:
自动构建 UI 品牌插件前端;
自动同步內嵌 Node/Python/Git 运行时包;
Tauri 自动编译 Rust 原生托盘及进程守护逻辑;
NSIS 最终打包输出。
打包过程通常需要 3 到 5 分钟,你可以通过下方绿色的 BUILD TERMINAL LOG 实时监控编译日志的推进。
提取产物 当状态指示牌变为 [打包成功] 后,点击下方弹出的 [📂 打开生成包文件夹] 按钮,系统会自动拉起你的 Windows 资源管理器。 在本地目录 src-tauri/target/release/bundle/nsis/ 下,你会看到一个体积轻巧、包含简体中文引导的 .exe 安装包! 双击安装后,一个完美定制的桌面 AI 客户端即宣告诞生。
💡 结语
基于 DSH 底座提供的完全开放的插件能力,再结合 jingyun-dsh 桌面整仓的 Tauri + NSIS 一键编译构建方案,极大地拉低了 AI 开发者将本地项目封装成桌面软件的难度。
无需编写一行复杂的 Rust 逻辑,通过 Python 极客控制台与内嵌运行时的完美融合,任何人都可以轻松拥有属于自己品牌的 AI 独立客户端!

图1:Tauri 沉浸式窗口架构 — Rust原生窗口壳层内嵌WebView运行DSH Web GUI,底部便携运行时包

图2:便携运行时打包流程 — 拉运行时→装DSH源码→注入jingyun-dsh→Tauri封装→NSIS出.exe

图3:NSIS 白标去噪 — 去英文向导/换图标/改标题/隐藏Tauri字样/内置品牌协议
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。