乐于分享
好东西不私藏

03-从0到1手搓FinClaw:源码打包exe

03-从0到1手搓FinClaw:源码打包exe
哈喽,各位老朋友。
前2期咱们聊了怎么把源码领回家,怎么搭环境,今天咱们要干点更有挑战性的——给这个Web版的OpenClaw,穿上一件“一键安装”的外衣。
为啥要折腾这个?因为OpenClaw原生是运行webchat的服务,跑起来得配环境、敲命令,对普通用户来说,门槛堪比“徒手造火箭”。咱们的FinClaw目标是做桌面客户端,所以今天这步“打包成exe”的实验,就是为未来铺路。咱们得先探探路,看看把这货塞进一个exe里,到底行不行!

第一步:摸清源码的“骨架”

动手之前,agent给OpenClaw把把脉。别看它文件多,其实骨架很清晰。核心就是那个Gateway Server,你可以把它想象成整个系统的“大脑”和“总指挥”。
这个“大脑”默认在 `18789` 端口听着,负责调度一切。它内部有几个关键的“器官”:
  • Plugin Registry(插件注册中心):这是它的“百宝箱”,所有的渠道(比如Telegram)、AI提供商(比如OpenAI)、工具(MCP)都注册在这里,随用随取。
  • Agent Runtime(代理运行时):这是它的“执行中枢”,负责管理会话、执行工具、处理上下文,你发给它的消息,都是这里在流转。
  • Channels & Providers(渠道与提供商):这就是它的“手”和“嘴”,一个负责对外连接(如Slack),一个负责对接AI大脑(如Anthropic)。
搞清楚这个架构,咱们打包的时候才知道哪些是“心脏”不能动,哪些是“阑尾”可以切。

第二步:Tauri + Rust 才是版本答案

既然要打包,市面上工具不少。但咱们做 FinClaw,得选个合适的工具。以前大家爱用 Electron,但这玩意儿就像是“为了喝杯醋包了顿饺子”——把整个 Chrome 浏览器都打包进去了,动不动就 100MB 起步,内存占用高得吓人,简直是“内存杀手”。
咱们这次要用的方案是:**Tauri + Rust**。
简单说,Tauri 不像 Electron 那样自带浏览器,而是直接调用你电脑系统自带的 WebView(Windows 上是 Edge 的 WebView2,Mac 上是 WebKit)。后端的逻辑呢,咱们用 Rust 来写。
这有什么好处?
  • 极致轻量:打包出来的 exe 可能只有几兆,比起 Electron 的“巨无霸”,它很精简。
  • 性能怪兽:Rust 的性能不用多说,内存安全又跑得快,启动速度嗖嗖的。
  • 自研 UI 空间大:前端咱们可以用自己熟悉的 Web 技术(Vue/React)写,通过 Tauri 跟后端的 Rust 通信,既能享受 Web 的开发效率,又能拥有原生应用的性能。
虽然 OpenClaw 原生是 Node.js 环境,但咱们这次的目标是验证“打包可行性”,所以咱们先用 Tauri 把这层 Web 界面“壳”给套上,把后端服务跑通。

第三步:实战演练,给代码穿上“外衣”

好了,咱们上手干活。要把 OpenClaw 变成 exe,其实就是把它的 Web 前端塞进 Tauri 的肚子里。
  1. **环境准备**:首先,你得在电脑上装好 Rust 环境(去 rustup.rs 一键安装,无脑下一步就行)。然后,在项目根目录运行 `npm install tauri`,把 Tauri 的依赖拉进来。
  2. **初始化 Tauri**:运行 `npm run tauri init`。这时候终端会问你几个问题,比如应用叫啥名(咱们叫 FinClaw-Test),窗口多大(先设个 800x600 吧)。这一步会在项目里生成一个 `src-tauri` 文件夹,这里就是 Rust 后端的大本营。
  3. **配置“大脑”连接**:OpenClaw 的后端服务(Gateway)需要启动。在 Tauri 的 Rust 代码里(`src-tauri/src/main.rs`),我们可以写一段逻辑,让应用在启动时,自动在后台把 OpenClaw 的 Node.js 服务拉起来,监听 `18789` 端口。
  4. **前端对接**:修改前端的配置文件(比如 `vite.config.js`),把代理指向本地的 Tauri 窗口。这样,当你打开打包好的软件时,界面其实是 Tauri 渲染的,但数据是发给本地启动的 OpenClaw 后端的。
这一步可能会有点枯燥,全是配置文件,但相信我,看到那个熟悉的 Web 界面出现在独立窗口里时,一切都值了。
但是这些其实不是需要我们自己真的动手,可以让agent规划进行执行的,不能让agent偷懒。

第四步:一键运行的快乐

配置搞定!在终端敲下 `npm run tauri build`。
这时候电脑风扇可能会开始狂转,Rust 编译器正在疯狂工作,把代码编译成机器语言。几分钟后(Rust 编译确实有点慢,忍忍),你会在 `src-tauri/target/release` 目录下发现一个 `.exe` 文件(Windows)或者 `.app`(Mac)。找不到路径就直接只会agent给你打开文件夹。
双击它!
不出意外的话,就要出意外了;你将会看到下面大大的错误。
这是要启动gateway服务的必经过程,openclaw后端服务需要链接上这个gateway;
别怕,有agent在,把每个错误丢个agent,让他分析解决,提供解决办法,啥都能搞定。
如果一切顺利,你就能进入openclaw的功能页面了。一个独立的窗口会弹出来,没有浏览器的地址栏,没有杂乱的标签页,只有干干净净的 OpenClaw 界面。
能进入UI页面,说明打包成功。然后配置自己的API,你输入指令,AI 回复,一切流畅得像原生应用一样。这就证明,咱们的路子走通了!OpenClaw 完全可以被“收容”进一个安装包。

第五步:精简功能

目前的这个 exe 其实是个“缝合怪”——它里面还藏着 Node.js 的环境,体积还不够极致。
而且,OpenClaw 原生支持那么多渠道(WhatsApp, Slack...)和那么多 AI 提供商,对于咱们 FinClaw 的初级版本来说,太臃肿了。
接下来的工作,就是“断舍离”:
  • 砍掉不用的插件:在Plugin Registry 里,把那些咱们暂时用不上的渠道和工具屏蔽掉,减少代码体积。
  • 静态资源优化:把前端的一些大图片、字体压缩一下。
  • 未来展望:等这步验证完美了,咱们下一步就是真正的“硬仗”——把后端的 Node.js 逻辑也逐步用 Rust 重写,那时候,才是真正的“纯血” FinClaw,体积能压缩到最小!
今天的“手搓”实验就到这,虽然过程有点折腾,但看着那个独立的图标,是不是成就感爆棚?咱们下期见,继续死磕 FinClaw!