# 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. 配置文件目录与日志目录 ### 3.1 call-client 配置文件(运行时): - Linux: `~/.config/call-client/config.json` - Windows: `%APPDATA%/call-client/config.json` 日志输出(运行时): - Linux: `~/.local/state/call-client/app.log` - Windows: `%LOCALAPPDATA%/call-client/state/app.log` ### 3.2 broadcast-client 配置存储(运行时): - 当前使用浏览器存储(`localStorage`),无独立磁盘配置文件 - 关键键名: - `runtime_broadcast_config` - `broadcast_config_local_fallback` 日志输出(运行时,socket 服务): - Linux: `~/.config/broadcast-client/socket-service-*.log` - Windows: `%APPDATA%/broadcast-client/socket-service-*.log` ### 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`