# TauriClient 打包与目录说明 ## 1. 打包命令流程 推荐使用双容器模式(默认)同时产出 `amd64` 和 `arm64`: ```bash cd /path/to/TauriClient chmod +x ./scripts/docker/run-build.sh ./scripts/docker/run-build.sh ``` > 默认会在打包结束后自动执行: > 1) `scripts/inject-deb-bootstrap.sh`(向 deb 注入 `postinst`,安装时自动写源与公钥) > 2) `scripts/build-apt-repo.sh`(生成可直接部署的 `dist/repo/`) > 3) `scripts/verify-apt-repo.sh`(发布前完整性自检) 只打指定项目: ```bash ./scripts/docker/run-build.sh call-client ./scripts/docker/run-build.sh broadcast-client ``` 可选模式: - 默认(双容器):`./scripts/docker/run-build.sh` - 容器 #1 构建 `amd64` - 容器 #2 构建 `arm64` - 混合模式:`./scripts/docker/run-build.sh --hybrid` - 宿主机构建 `amd64` - 容器构建 `arm64` - 若仅需 `.deb` 不生成仓库目录:`GENERATE_APT_REPO=0 ./scripts/docker/run-build.sh` - 默认使用签名 Key:`com.jgzy.product`(密钥缺失时会自动创建) - 如需禁用自动创建密钥:`APT_GPG_AUTO_CREATE=0 ./scripts/docker/run-build.sh` - 如需跳过 deb 自动初始化注入:`INJECT_DEB_BOOTSTRAP=0 ./scripts/docker/run-build.sh` - 默认会在生成仓库后自动自检(`verify-apt-repo.sh`);如需跳过:`VERIFY_APT_REPO=0 ./scripts/docker/run-build.sh` ## 2. 打包产物位置 统一产物目录: - `dist/linux-deb/call-client/amd64/*.deb` - `dist/linux-deb/call-client/arm64/*.deb` - `dist/linux-deb/broadcast-client/amd64/*.deb` - `dist/linux-deb/broadcast-client/arm64/*.deb` 自动生成的 APT 仓库目录(可直接打包上传仓库机): - `dist/repo/dists/v10/...` - `dist/repo/pool/main/...` Tauri 原始输出目录: - `call-client/src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/deb/` - `call-client/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/deb/` - `broadcast-client/src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/deb/` - `broadcast-client/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/deb/` ## 3. 配置文件目录与日志目录 以下与各自 `src-tauri/tauri.conf.json` 里的 **`bundle.identifier`** 一致(当前为 `com.ziyun.callclient`、`com.ziyun.broadcastclient`)。若改过 identifier,中间目录名会随之变化。 **路径中的用户名**:下文以 Linux 用户 `alice`、Windows 用户 `Alice` 为例;请把 `alice` / `Alice` 换成本机实际登录名(Linux 一般为 `/home/<登录名>` 中的 `<登录名>`;Windows 一般为 `C:\Users\<登录名>` 中的 `<登录名>`)。 ### 3.1 call-client Bundle ID:`com.ziyun.callclient`。 **默认环境(未设置 `XDG_CONFIG_HOME`、`XDG_DATA_HOME`)** | 用途 | Linux 完整路径示例 | Windows 完整路径示例 | |------|----------------------|----------------------| | 应用配置 | `/home/alice/.config/com.ziyun.callclient/config.json` | `C:\Users\Alice\AppData\Roaming\com.ziyun.callclient\config.json` | | 主程序日志 | `/home/alice/.config/com.ziyun.callclient/app.log`(轮转文件形如 `/home/alice/.config/com.ziyun.callclient/app-20260513120000.log`) | `C:\Users\Alice\AppData\Roaming\com.ziyun.callclient\app.log`(同级目录下 `app-*.log`) | | 运行时会话(多窗口共享) | `/home/alice/.local/share/com.ziyun.callclient/runtime_session.json` | `C:\Users\Alice\AppData\Local\com.ziyun.callclient\runtime_session.json` | | 单实例锁 | `/home/alice/.local/share/com.ziyun.callclient/single-instance.lock` | `C:\Users\Alice\AppData\Local\com.ziyun.callclient\single-instance.lock` | **若设置了 XDG 环境变量(Linux)** - 当 `XDG_CONFIG_HOME` 为 `/data/my-config` 时,配置文件与 `app.log` 在: `/data/my-config/com.ziyun.callclient/config.json` `/data/my-config/com.ziyun.callclient/app.log` - 当 `XDG_DATA_HOME` 为 `/data/my-data` 时,`runtime_session.json` 与 `single-instance.lock` 在: `/data/my-data/com.ziyun.callclient/runtime_session.json` `/data/my-data/com.ziyun.callclient/single-instance.lock` 实现依据:`call-client/src-tauri/src/commands/config.rs`、`logger.rs`、`session.rs`。 > 旧版本若使用独立目录名 `call-client` 或日志放在 `local/state` 等路径,已废弃;当前统一为上述 `com.ziyun.callclient` 目录。 ### 3.2 broadcast-client Bundle ID:`com.ziyun.broadcastclient`。 **默认环境(未设置 `XDG_CONFIG_HOME`)** | 用途 | Linux 完整路径示例 | Windows 完整路径示例 | |------|----------------------|----------------------| | 持久化配置 | `/home/alice/.config/com.ziyun.broadcastclient/broadcast-config.json` | `C:\Users\Alice\AppData\Roaming\com.ziyun.broadcastclient\broadcast-config.json` | | Socket 服务日志(文件名含时间戳) | `/home/alice/.config/com.ziyun.broadcastclient/socket-service-20260513-120000-000.log` | `C:\Users\Alice\AppData\Roaming\com.ziyun.broadcastclient\socket-service-20260513-120000-000.log` | **若 `XDG_CONFIG_HOME` 为 `/data/my-config`(Linux)** - `/data/my-config/com.ziyun.broadcastclient/broadcast-config.json` - `/data/my-config/com.ziyun.broadcastclient/socket-service-<时间戳>.log` **浏览器侧回退**(`localStorage` 键名,非磁盘路径):`runtime_broadcast_config`、`broadcast_config_local_fallback`。 实现依据:`broadcast-client/src/services/configStore.ts`、`broadcast-client/src-tauri/src/lib.rs`。 > 旧版本若使用 `broadcast-client` 作为配置目录名,已废弃;当前为 `com.ziyun.broadcastclient`。 ### 3.3 两个项目仓库内 Tauri 打包配置(源码路径) - `call-client/src-tauri/tauri.conf.json` - `broadcast-client/src-tauri/tauri.conf.json` ## 4. 应用图标(bundle) ### 推荐:`tauri icon`(`@tauri-apps/cli` 内置,社区常用) Tauri 官方 CLI 提供 **`tauri icon`**:用**一张**高质量源图生成各平台所需尺寸(`32x32.png`、`128x128.png`、`icon.ico` 等)。部分环境下 **`tauri.conf.json` 的 `bundle.icon` 不会自动改写**,若发现未更新,请确认其中包含上述生成文件(本仓库已按生成结果维护默认列表)。 **源图要求:** 正方形 **PNG**,建议 **1024×1024**,**RGBA**(带透明)。可先用 Photoshop / Figma 导出一张再执行下面命令。 在各子项目根目录执行: ```bash # call-client(默认源图:src-tauri/icons/call_icon.png) cd call-client npm run icons:generate ``` ```bash # broadcast-client(默认源图:src-tauri/icons/bc_icon.png) cd broadcast-client npm run icons:generate ``` 等价命令: ```bash npm run tauri -- icon ./src-tauri/icons/call_icon.png # 或 broadcast-client 下对 bc_icon.png ``` 生成结果会写入各项目 `src-tauri/icons/`。若 **`bundle.icon` 未自动更新**,请对照目录里新生成的 `32x32.png`、`128x128.png`、`128x128@2x.png`、`icon.icns`、`icon.ico`、`icon.png` 检查配置。换源图路径可改对应 `package.json` 里的 **`icons:generate`** 脚本。 ### 说明 - 这里使用的是 **`@tauri-apps/cli` 自带的 `icon` 子命令**,无需再装名为 `tauri-icon` 的独立包;若文档里写作「tauri-icon 工具」,一般即指该命令。 - 源图若不是 RGBA,构建阶段仍可能报 `icon ... is not RGBA`,请在上游导出时勾选透明度。 ## 5. Windows Nginx + 内网 APT 仓库(麒麟 V10)模板 以下模板用于“客户端检查更新 + 引导 apt 升级”,适用于 `call-client` 与 `broadcast-client`。 ### 5.1 仓库目录模板 ```text repo/ ├─ dists/ │ └─ v10/ │ ├─ InRelease │ ├─ Release │ ├─ Release.gpg │ └─ main/ │ ├─ binary-amd64/ │ │ ├─ Packages │ │ └─ Packages.gz │ └─ binary-arm64/ │ ├─ Packages │ └─ Packages.gz └─ pool/ └─ main/ ├─ c/call-client/call-client__amd64.deb ├─ c/call-client/call-client__arm64.deb ├─ b/broadcast-client/broadcast-client__amd64.deb └─ b/broadcast-client/broadcast-client__arm64.deb ``` ### 5.2 发布步骤(每次发版) 由于仓库机是内网且不安装构建环境,统一在**发布机器**执行: ```bash cd /path/to/TauriClient chmod +x ./scripts/docker/run-build.sh ./scripts/build-apt-repo.sh ./scripts/inject-deb-bootstrap.sh ./scripts/verify-apt-repo.sh ./scripts/docker/run-build.sh ``` 执行完成后会得到: - `dist/linux-deb/...`:原始构建产物 `.deb` - `dist/repo/...`:可直接部署到仓库机的 APT 仓库目录(含索引与签名) - `dist/repo/zyyun-archive-keyring.asc`:客户端导入用 ASCII 公钥 - `dist/repo/zyyun-archive-keyring.gpg`:客户端可直接使用的 keyring 二进制公钥 最后只需把 `dist/repo` 整体打包上传到仓库机并对外提供 `http://80.12.140.29:80/apt`。 > 脚本内置的签名密钥生成命令如下(密钥不存在且 `APT_GPG_AUTO_CREATE=1` 时自动执行): > `gpg --batch --pinentry-mode loopback --passphrase "" --quick-gen-key "com.jgzy.product" rsa4096 sign 5y` 手工初始化(仅在未使用 deb 自动初始化时作为兜底): ```bash curl -fsSL http://80.12.140.29:80/apt/zyyun-archive-keyring.asc | sudo gpg --dearmor -o /usr/share/keyrings/zyyun-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/zyyun-archive-keyring.gpg] http://80.12.140.29:80/apt v10 main" | sudo tee /etc/apt/sources.list.d/zyyun.list sudo apt update ``` 发布后可手工复核(脚本已在 `run-build.sh` 里自动执行一次): ```bash bash ./scripts/verify-apt-repo.sh ``` 该脚本会校验以下关键项: - `InRelease`、`Release`、`Release.gpg` - 公钥文件 `zyyun-archive-keyring.asc`、`zyyun-archive-keyring.gpg` - 各架构 `Packages.gz` 是否存在且可正常解压 - `pool/main` 下是否存在 `.deb` 包 #### 5.2.1 deb 自动初始化(已默认启用) `run-build.sh` 默认会调用 `scripts/inject-deb-bootstrap.sh`,对构建出的 deb 注入 `postinst` 与内置公钥。 用户只需执行 deb 安装(图形安装器或 `dpkg -i`),安装阶段会自动: 1. 安装公钥到 `/usr/share/keyrings/zyyun-archive-keyring.gpg` 2. 写入源文件 `/etc/apt/sources.list.d/zyyun.list` 3. 执行 `apt-get update`(失败不阻断安装) 内置源固定为: ```bash deb [signed-by=/usr/share/keyrings/zyyun-archive-keyring.gpg] http://80.12.140.29:80/apt v10 main ``` 发版前可快速确认某个包已注入 bootstrap: ```bash bash ./scripts/verify-deb-bootstrap.sh dist/linux-deb/call-client/amd64/*.deb ``` 或校验全部 deb: ```bash bash ./scripts/verify-deb-bootstrap.sh --all ``` ### 5.3 Windows Nginx 本地目录直读模板 ```nginx server { listen 80; server_name 80.12.140.29; location /apt/ { alias F:/workspace/zyclient_linux/TauriClient/dist/repo/; autoindex on; } } ``` 路径映射关系: - `http://80.12.140.29:80/apt/dists/v10/Release` - 对应本地文件 `F:/workspace/zyclient_linux/TauriClient/dist/repo/dists/v10/Release` 客户端源配置示例: ```bash deb [arch=amd64 signed-by=/usr/share/keyrings/zyyun-archive-keyring.gpg] http://80.12.140.29:80/apt v10 main ``` ### 5.3.1 方案二:80 端口被其他服务占用时 如果 `80.12.140.29:80` 已由 IIS / Apache / 其他网关占用,推荐做法是: 1. 保持现有 80 入口不变(外部地址仍为 `http://80.12.140.29:80/apt`)。 2. 让 Nginx 改为监听本机其他端口(例如 `127.0.0.1:8080`)。 3. 由现有 80 入口服务将 `/apt/` 路径反向代理到 `http://127.0.0.1:8080/apt/`。 Nginx(仓库中转)示例: ```nginx server { listen 127.0.0.1:8080; server_name localhost; location /apt/ { alias F:/workspace/zyclient_linux/TauriClient/dist/repo/; autoindex on; } } ``` 80 入口服务需要保证: - 对外保留路径 `/apt/`。 - 不对 `dists/`、`pool/`、`Packages.gz`、`InRelease` 做重写或鉴权跳转。 - 转发后客户端源配置保持不变: - `deb [arch=amd64 signed-by=/usr/share/keyrings/zyyun-archive-keyring.gpg] http://80.12.140.29:80/apt v10 main` ### 5.4 客户端交互建议 - “检查更新”按钮只做检测与引导,不在应用内直接执行 `sudo`。 - 检测成功有新版本时,提示并复制命令: - `sudo apt update && sudo apt install --only-upgrade call-client` - `sudo apt update && sudo apt install --only-upgrade broadcast-client`