Electron + DeepSeek Harness:一键安装包构建与自动发布实录
前阵子一直在做自己的桌面端 deepseek harness 工具,功能迭代得差不多之后,我就开始琢磨分发问题。天天让朋友用 npm run dev 跑源码肯定不现实,干脆把它打包成 Windows 一键安装版,而且更进一步,让项目本身在自己的构建流程里“自己打包自己”。这篇文章把整个过程完整记录下来,包括 Electron 工程结构、electron-builder 配置、NSIS 一键安装脚本、GitHub Actions 自动构建,以及我在打包过程中踩过的各种坑。内容偏实操,代码都可以直接复制改着用。
1. 背景:为什么需要桌面端 deepseek harness
1.1 什么是 deepseek harness
DeepSeek 是当前很流行的国产大模型,API 调用成本相对实惠,效果也不错。而 harness 这个词在 AI 工程领域通常指“套件”或“工作台”,你可以把它理解为:围绕 DeepSeek API 构建的一层工具链,用来管理上下文、编排 Prompt、批量对话、处理工具调用(Function Calling)、保存会话记录等。
直白一点说,deepseek harness 解决的是这三类问题:
- 管理多个 Prompt 模板和上下文策略;
- 串联模型输出和外部工具/脚本;
- 保存和复用历史会话,方便做效果对比。
这些东西如果只靠浏览器里的 DeepSeek 网页版,很难做到灵活。就算你已经会写 Python 脚本去调用 DeepSeek API,日常高频使用还是需要一个带 GUI 的客户端。
1.2 为什么要专门做桌面端
很多人会问:直接做个 Web 页面不就好了?我的答案是,桌面端有桌面端的价值。
桌面端可以读取本地文件,可以让模型直接读取某个项目目录下的代码,可以跨域请求多个 API 端点而不用处理 CORS 问题。最关键的,桌面端能像本地 IDE 一样工作,Prompt、上下文、会话记录全部存在本地,不用依赖浏览器登录态。而一键安装版的意义更简单:让不懂 Node.js、不懂 git、不碰命令行的朋友也能直接用。
1.3 自行打包的核心思路
所谓“自己打包自己”,本质就是让打包脚本成为项目的一部分,在 CI 或者本地执行一条 npm run build:win,就能完成前端编译、Electron 资源整理、NSIS 安装包生成。更进一步,把它挂到 GitHub Actions 上,每次打 tag 或发布 Release 时自动跑完整流程,然后把安装包上传到 Release 附件。整个过程不需要人工在本地重复执行,用户点开 Releases 页面就能下载。
接下来就从工程结构开始,完整走一遍。
2. 环境准备与项目初始化
2.1 开发环境说明
本文环境以 Windows 11 为主,macOS 和 Linux 下配置类似,命令稍有差异。
- Node.js:建议使用 LTS 版本,比如常见的 18 或 20,我用的是 20 系列。
- 包管理器:npm,也可以用 pnpm,但注意 electron-builder 的 lock 文件要一致。
- 前端框架:Vite + React,你也可以换成 Vue,打包配置大同小异。
- Electron:使用当前稳定版本,建议不要使用太老的版本,否则与 New 版本 Node API 有兼容问题。
- 打包工具:electron-builder,它支持 Windows NSIS、macOS DMG、Linux AppImage 等多种目标。
版本需要根据你的项目实际情况调整,下面的配置以主流稳定版为例,重点演示配置思路,不要盲抄具体版本号。
2.2 初始化项目
执行下面命令创建一个基础工程:
然后安装核心依赖:
其中 concurrently 用来同时启动 Vite 开发服务器和 Electron,wait-on 等待开发服务器就绪,cross-env 解决 Windows 下环境变量写法不一致的问题。
2.3 项目目录结构
我采用的是 Electron + Vite 最常见的目录划分方式:
electron 目录放主进程代码,src 目录放渲染进程代码,build 目录放图标和 NSIS 脚本,.github 目录放自动化构建工作流。
2.4 package.json scripts 设计
先规划好 scripts,后续“自己打包自己”全靠这几行命令串联:
注意 main 字段指向的是打包后的主进程文件,而不是源码 TS 文件。很多新手卡在这里,Electron 直接运行 main.ts 是跑不起来的,必须先编译成 JS。
3. Electron 核心进程与 DeepSeek Harness 的接入
3.1 主进程代码
主进程负责创建窗口、管理生命周期、处理与操作系统的交互。下面是简化版主进程示例,文件路径 electron/main.ts: