Paw GUI
Paw 的 GUI 客户端,基于 Tauri 构建。
- 有关系统服务部分,请看其[独立的文档](./src-tauri/system -service/README.md)
- 有关 Rust 部分,请看其独立的文档,下文是前端的项目结构介绍
项目结构
- index.html 前端入口
- package.json 包管理器配置文件
- tailwind.config.js tailwindcss配置文件
- postcss.config.js postcss配置文件
- tsconfig.json ts编译器配置
- tsconfig.node.json 同上
- vite.config.ts vite配置,管理打包相关
build-sidecar.mjs用于打包 sidecar 程序,在调试、发布前会被调用- src/
- assets/ 前端使用的静态资源,如图片、字体
- components/ 前端组件
- pages/ 前端不同页面
- utils/ 实用工具模块
- App.css 全局 CSS 代码块,目前仅用于导入 tailwindcss
- App.tsx 软件页面入口
- bindings.ts 自动生成的 command、event 和类型的定义(从 rust 端)
如何启动/调试项目
- 安装语言工具链(需要node、pnpm、rust工具链和go工具链),目前需要go工具链是因为
build-sidecar.mjs中也生成 CLI 的二进制文件,未来可能改为下载 - 安装依赖
pnpm i - 启动调试模式
pnpm tauri dev(build-sidecar.mjs会在其中自动先运行,但是如果更改了 sidecar 的源代码,需要手动重新运行该命令,sidecar 包括src-tauri/system-service和../proxy)
如何打包测试客户端
假设你已经完成了调试的步骤,那么只需要执行 pnpm tauri build 即可构建项目,构建完成后会在 src-tauri/target/release/bundle 中生成对应的测试用安装包。
如何打包正式客户端
首先,需要按照下表设置环境变量
| 变量名 | 值类型 | 示例值 | 说明 |
|---|---|---|---|
| GRPC_ENDPOINT | 用逗号分割的端点组 | "156.229.167.121:9090," | GRPC 服务的端点 |
| COSMOS_ENDPOINT | 用逗号分割的端点组 | "http://156.229.167.121:26657," | COSMOS 服务的端点 |
| NODE_SECRET | 字符串 | "ZXN0YXRlIH…xhgdmlkZW8=" | 账户助记词的base64 |
| IS_DEBUG | 字符串 | "false" | 必须为"true"或"false" |
| ACCOUNT_NAME | 字符串 | "de1" | 账户名 |
然后,执行 pnpm tauri build 即可构建项目,构建完成后会在 src-tauri/target/release/bundle 中生成对应的正式用安装包。
注意,启动后程序会将配置文件持久化到 %AppData%\com.paw.paw-gui 中,这个路径由 tauri 的 store 插件指定,如果使用了不同的环境变量构建程序,并且想要重复启动调试,还需要删除这个里面的json文件
这个路径在不同操作系统是不同的,查看Tauri的源代码发现其利用了库 dirs 的 data_dir,如下:
- Linux:
XDG_DATA_HOME/com.paw.paw-gui或$HOME/.local/share/com.paw.paw-gui - Windows:
%AppData%/com.paw.paw-gui - macOS:
$HOME/Library/Application Support/com.paw.paw-gui
多个二进制之间的关系
- GUI: 本项目,直接调用安装卸载器,通过HTTP与Core、Service通信
- Core: Go编写的命令行程序,位于
../proxy/cmd/client - SystemService: 运行在系统服务中的二进制,位于
src-tauri/system-service - ServiceInstaller: 用于安装系统服务的二进制,位于
src-tauri/system-service/installer/install.rs - ServiceUninstaller: 用于卸载系统服务的二进制,位于
src-tauri/system-service/installer/uninstall.rs
flowchart LR
Core <-- HTTP --> GUI
SystemService <-- HTTP --> GUI
GUI -- sudo exec --> ServiceInstaller
ServiceInstaller -- install --> SystemService
GUI -- sudo exec --> ServiceUninstaller
ServiceUninstaller -- uninstall --> SystemService
SystemService -- exec/kill --> Core
如何更改 sidecar 的名称?
- 更改对应
Cargo.toml中bin/name的名字(系统服务这么改,CLI直接修改GO项目输出文件名即可) - 更改
build-sidecar.mjs脚本中binaries数组中的名称字符串与上一步匹配(CLI则修改下载文件名) - 更改
tauri.config.json中externalBin名称 - 更改
src-tauri/common/lib.rs中的静态字符串名称 - 更改
src-tauri/install-scripts中安装脚本中的字符串名称
如何更新程序版本号?
更改 src-tauri/Cargo.toml 中的 workspace.package.version(GUI、系统服务和 Common 的 package 版本号),不需要管理 package.json 版本号。不论是 cargo 识别到的环境变量,还是 tauri 中获取的版本号,都是以此为准。
若 GUI 发现系统服务返回的版本号与自身不一致,会执行卸载重装系统服务的操作,使得系统服务版本再次与自己匹配。
其他注意事项
- 在 Linux 上,提权依赖 pkexec,因此在 WSL 下,通过程序内安装服务需要先安装 polkit,而且需要有桌面环境(但是在程序通过包管理器安装时应该已经安装过服务了,这个仅作为修复服务的方案)
Description
Languages
TypeScript
90%
Rust
6.6%
SCSS
2.5%
Just
0.3%
JavaScript
0.2%
Other
0.2%