You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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_<version>_amd64.deb
├─ c/call-client/call-client_<version>_arm64.deb
├─ b/broadcast-client/broadcast-client_<version>_amd64.deb
└─ b/broadcast-client/broadcast-client_<version>_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`