
项目简介
DeepSeek Harness Easy-Setup 是一个面向 Windows 的打包项目。它把 @deepseek-ai/dsh 命令行程序、便携版 Node.js 运行时、启动器和关闭器整合为一个安装程序。
最终用户不需要预先安装 Node.js、npm 或其他依赖。安装后,可以通过桌面或开始菜单中的快捷方式启动 dsh web,服务就绪后会自动打开浏览器。
安装后的功能
- 桌面和开始菜单分别创建“DeepSeek Harness”快捷方式。
- 创建“关闭 DeepSeek Harness”快捷方式,用于结束正在运行的服务。
- 启动器运行
dsh web,并在服务启动后自动打开浏览器。 - 开始菜单提供卸载入口,Windows“应用”列表中也会显示该程序。
- 使用 dsh 前端自带的鲸鱼 favicon 作为应用图标。
- 按当前用户安装,不触发 UAC 提权。
默认安装目录如下:
%LOCALAPPDATA%\Programs\DeepSeekHarness用户也可以在安装向导中选择其他目录。
理解项目目录
开始构建前,可以先了解几个关键目录的用途:
build\build.ps1:总构建入口,负责获取 dsh、下载便携版 Node.js、生成图标、编译启动器和关闭器,并创建安装包。build\fetch-nsis.ps1:下载便携版 NSIS 3.11,并在 SourceForge 镜像不可用时尝试其他镜像。src\Launcher.cs:启动器源码,编译后生成DeepSeekHarness.exe。src\Stopper.cs:关闭器源码,编译后生成DeepSeekHarnessStop.exe。src\installer.nsi:NSIS 安装脚本。src\icon\build-icon.js:使用 dsh 自带的 sharp,将鲸鱼 SVG 转换为多尺寸 ICO。test\test-install.ps1:执行静默安装、文件检查、启动、停止、HTTP 检查和卸载测试。work\:保存 Node.js 压缩包、NSIS 和 staging 等中间文件,可删除,也可保留以加快后续构建。out\:保存最终的单文件安装程序。
准备构建环境
构建机需要满足以下条件:
- Windows 10 或 Windows 11 x64。
- PowerShell 5.1。
- .NET Framework 4.x。
- 已安装 Node.js,并确保
node.exe可从 PATH 找到,或者构建时显式指定路径。 - 能够访问
nodejs.org和 SourceForge。
项目使用系统自带的 C# 编译器编译两个可执行文件,默认路径为:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe如果系统没有安装 NSIS 3.x,构建脚本会自动把便携版下载到 work\nsis。
重要:项目所在路径不要包含空格,因为
makensis的命令行定义参数无法正确处理带空格的路径。
第一步:安装 dsh
构建脚本默认从全局 npm 目录读取 @deepseek-ai/dsh。先在构建机上执行:
npm i -g @deepseek-ai/dsh默认包目录为:
%APPDATA%\npm\node_modules\@deepseek-ai\dsh如果 dsh 位于其他位置,可以稍后通过 -DshSource 参数指定。
第二步:构建单文件安装程序
进入项目根目录,运行:
powershell -ExecutionPolicy Bypass -File build\build.ps1脚本会依次准备 dsh 文件、便携版 Node.js、应用图标、C# 启动器、关闭器和 NSIS 安装包。默认产物类似:
out\DeepSeekHarness-Setup-0.1.1.exeREADME 给出的示例安装包大小约为 44 MB。
常用构建参数
-DshSource <目录>:指定 dsh 包目录。-NodeExe <路径>:指定构建机上的node.exe。-AppVersion <版本>:覆盖安装包版本号。-WorkDir <目录>:修改中间文件目录。-OutDir <目录>:修改安装包输出目录。
例如,使用自定义 dsh 路径、Node.js 路径和版本号:
powershell -ExecutionPolicy Bypass -File build\build.ps1 -DshSource C:\dev\dsh -NodeExe C:\nodejs\node.exe -AppVersion 0.1.1 -OutDir C:\dsh-output默认情况下,版本号取自 dsh 的 package.json。预发布版本会被转换为基础版本,例如 0.1.1-rc.2 会生成 0.1.1。
work\ 中的文件会被保留并复用。Node.js 压缩包下载完成后不会重复下载,解压后的 NSIS 目录也会继续使用。
第三步:安装和基本使用
构建完成后,双击 out\ 目录中的安装程序,按向导完成安装。由于采用当前用户安装模式,默认不会出现 UAC 提权提示。
- 双击桌面或开始菜单中的“DeepSeek Harness”。
- 启动器运行
dsh web。 - 服务可用后,默认浏览器会自动打开对应页面。
- 需要停止服务时,运行“关闭 DeepSeek Harness”。
- 需要移除程序时,从开始菜单卸载入口或 Windows“应用”列表执行卸载。
也可以使用静默模式安装到默认目录:
out\DeepSeekHarness-Setup-0.1.1.exe /S第四步:运行自动化测试
项目提供了覆盖完整安装流程的测试脚本:
powershell -ExecutionPolicy Bypass -File test\test-install.ps1测试脚本会执行以下操作:
- 静默安装到项目下的
testinstall\。 - 逐项检查安装文件和快捷方式。
- 使用模拟入口验证启动器和关闭器行为。
- 使用安装目录中的便携版 Node.js 真正启动一次
dsh web。 - 通过默认测试端口
3999检查 HTTP 200 响应,避免占用常见的3080端口。 - 执行卸载并检查结果。
输出中会出现多行以 ### 开头的检查信息。最后一行应为:
ALL CHECKS PASSED如果测试失败,最后会显示失败项数量。
注意:测试创建的快捷方式名称与正式安装完全相同,因此运行测试时,当前用户桌面和开始菜单中的快捷方式会临时指向
testinstall\,并在卸载阶段被删除。测试完成后,如需恢复正式安装,可再次执行安装程序的静默安装命令。
运行日志与故障排查
运行期间的重要状态文件保存在:
%LOCALAPPDATA%\DeepSeekHarness\pid.txt
%LOCALAPPDATA%\DeepSeekHarness\run.logpid.txt保存正在运行的 dsh 进程号,关闭器根据它定位目标进程。run.log保存 dsh 的标准输出和标准错误。
如果启动失败,启动器会通过弹窗提示 run.log 的位置。排查时应优先查看该日志,确认端口占用、依赖加载或服务启动错误。
高级技巧与实现注意事项
确保 Node.js 版本与原生模块匹配
dsh 的依赖中包含 node-pty、sharp 和 koffi 等原生模块。便携版 Node.js 必须与这些模块兼容,因此构建脚本默认选择与构建机相同的 Node.js 版本。更换 -NodeExe 时,应重新确认安装包能够正常启动。
避免重复启动服务
当默认 3080 端口上的 dsh 已经运行时,再次双击启动器不会创建第二个实例。启动器会检查 pid 文件中的进程是否仍然存活,并直接打开现有服务页面。
不要让启动器过早退出
启动器拉起 dsh 后会继续作为宿主进程留在后台,把标准输出和标准错误持续写入 run.log,直到 dsh 退出。如果启动器立即结束,输出管道会断开,dsh 后续写日志时可能出现 EPIPE。
正确等待 NSIS 卸载完成
NSIS 卸载器会先把自己复制到 %TEMP%,然后从临时目录继续执行,原卸载进程会很快退出。因此,自动化脚本不能仅等待原进程结束,而应轮询安装目录是否已经消失。项目的 test-install.ps1 已提供对应实现。
注意安装脚本编码
installer.nsi 必须使用 UTF-8 BOM 或 UTF-16LE,否则 NSIS 会报告 Bad text encoding。仓库中的源文件是无 BOM 的 UTF-8,build.ps1 会在调用 makensis 前将其转换为 UTF-16LE。
控制安装包体积
打包过程会移除 Windows x64 环境不会加载的文件,包括 node-pty 的 Darwin、Linux、ARM64 预编译文件和 sharp 的 WASM 版本。README 说明这一处理可节省约 30 MB。
许可说明
dsh 本体采用 MIT 许可,具体内容可查看 dsh 包中的 LICENSE。本项目的安装包脚本同样以 MIT 许可发布。鲸鱼图标来自 dsh 前端资源,版权归 DeepSeek。
总结
DeepSeek Harness Easy-Setup 将 dsh、便携版 Node.js、Windows 启停程序和 NSIS 安装流程整合在一起。完成环境准备后,只需全局安装 dsh 并运行 build\build.ps1,即可生成无需目标机器预装 Node.js 的单文件安装程序。发布前建议执行完整测试脚本,并重点检查日志、Node.js 版本兼容性和快捷方式恢复情况。
