# Paw GUI Paw 的 GUI 客户端,基于 Tauri 构建。 - 有关系统服务部分,请看其[独立的文档](./src-tauri/system -service/README.md) - 有关 Rust 部分,请看其[独立的文档](./src-tauri/README.md),下文是前端的项目结构介绍 ## 项目结构 - 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 端)** ## 如何启动/调试项目 1. 安装语言工具链(需要node、pnpm、rust工具链和go工具链),目前需要go工具链是因为 `build-sidecar.mjs` 中也生成 CLI 的二进制文件,未来可能改为下载 2. 安装依赖 `pnpm i` 3. 启动调试模式 `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` ```mermaid 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 的名称? 1. 更改对应 `Cargo.toml` 中 `bin/name` 的名字(系统服务这么改,CLI直接修改GO项目输出文件名即可) 2. 更改 `build-sidecar.mjs` 脚本中 `binaries` 数组中的名称字符串与上一步匹配(CLI则修改下载文件名) 3. 更改 `tauri.config.json` 中 `externalBin` 名称 4. 更改 `src-tauri/common/lib.rs` 中的静态字符串名称 5. 更改 `src-tauri/install-scripts` 中安装脚本中的字符串名称 ## 如何更新程序版本号? 更改 `src-tauri/Cargo.toml` 中的 `workspace.package.version`(GUI、系统服务和 Common 的 package 版本号),不需要管理 `package.json` 版本号。不论是 cargo 识别到的环境变量,还是 tauri 中获取的版本号,都是以此为准。 若 GUI 发现系统服务返回的版本号与自身不一致,会执行卸载重装系统服务的操作,使得系统服务版本再次与自己匹配。 ## 其他注意事项 - 在 Linux 上,提权依赖 pkexec,因此在 WSL 下,通过程序内安装服务需要先安装 polkit,而且需要有桌面环境(但是在程序通过包管理器安装时应该已经安装过服务了,这个仅作为修复服务的方案)