跳转至

构建与发布

最后更新:2026-09-22 23:00

本文档说明 OneTHU 从源码到安装包的完整链路:环境要求、开发与生产构建、sidecar(Harness) 的构建位置、CI 发布与提交前自检。宿主实现细节见 系统架构, 安卓 release 专属故障见 安卓 release 陷阱与取证。

1. 环境要求

用途 要求
全平台 Node ≥ 20、pnpm、Rust toolchain(桌面 / 移动壳需 Rust 编译)
Android Android SDK + NDK;apps/desktop/src-tauri/gen/android 为 git 跟踪的软链,目标目录必须位于支持符号链接的卷(如 APFS)
桌面原生模块 macOS 需 Xcode 命令行工具;Windows 需 MSVC 生成工具

构建位置

Rust 与前端构建均在本地磁盘(APFS / NTFS)上进行。仓库位于 exFAT 等外置卷时, 使用 CARGO_TARGET_DIR 将 Cargo 产物指向本地磁盘,可避免硬链接与权限相关的构建失败。

2. 仓库结构

OneTHU/
├── packages/
│   ├── core/        @onethu/core      统一 API 客户端与数据层
│   ├── info-lib/    thu-info-lib 移植 信息门户数据层
│   └── ui/          @onethu/ui        设计令牌与基础样式
├── apps/
│   └── desktop/     @onethu/desktop   桌面端 + Android(Tauri 2,Vite + React)
├── plugins/
│   └── OneTHU-Harness/                官方骨干插件(Rust sidecar / Android 内嵌)
├── tools/                             各类 Node 侧测试与检查脚本
└── docs/                              本文档正文来源

3. 日常开发

pnpm install                                  # 安装 workspace 全部依赖

pnpm dev                                      # 浏览器预览(Vite dev server)
pnpm --filter @onethu/desktop tauri:dev       # 原生桌面壳开发模式(前端热更新)

bash apps/desktop/scripts/dev-launch.sh       # tauri:dev 的入口(含前置清理)
node apps/desktop/scripts/build-harness.mjs   # 重建 Harness sidecar

浏览器预览无法读取原生传输层的响应头与会话 Cookie;涉及登录态、插件宿主、通知与 小组件的验证须在原生壳中进行。

4. 生产构建

pnpm build                                              # 构建全部包;web 资产产出至 apps/desktop/dist
pnpm --filter @onethu/desktop build:harness             # 构建 sidecar(须先于打包)

pnpm --filter @onethu/desktop tauri:build               # 桌面安装包(自动先执行前端构建)

bash apps/desktop/scripts/build-release-apk.sh          # 发布线 Android APK(arm64;见 §6 双线纪律)
bash apps/desktop/scripts/build-demo-apk.sh             # demo 线脱敏演示版 APK(见「脱敏演示版构建」)

Android 打包脚本先自检发布线不变量(正式包名 + 不脱敏),再把工程置于内盘、构建并签名 (默认 debug 证书,与线上 Release 同证书)。直接调用 pnpm --filter @onethu/desktop exec tauri android build --apk 会跳过这些前置步骤。

产物 路径
桌面安装包 apps/desktop/src-tauri/target/release/bundle/
Android APK apps/desktop/src-tauri/gen/android/.../build/outputs/apk/
前端资产 apps/desktop/dist/

sidecar 须在目标平台现场构建

仓库不携带任何架构的二进制。Harness sidecar 若在其他平台构建并打入安装包, 插件宿主将无法启动。CI 在目标平台现场构建;本地跨平台打包时同样需要先重建。

5. CI 发布链路

.github/workflows/release.yml:

触发 行为
推送 v* 标签 构建 macOS(aarch64,.dmg)与 Windows(NSIS .exe)安装包,并上传为 Release 产物
手动触发 可只执行 Windows job,用于验证 Windows 构建链

Android APK 不在 CI 构建:gen/android 不入库,签名在本机完成。发布前请核对 签名版本号与 tauri.conf.json 中的版本号一致。

6. 分支约定

分支 用途
dev3 开发与发布都在此分支(GitHub 与清华 GitLab 两个远端同步);本地检出的分支名为 dev2,推送目标为 dev3
demo 脱敏演示版:包名 app.onethu.demo,可与正式版共存,见 脱敏演示版构建

双线纪律(2026-09-21 事故后加):demo 与发布线 dev3 只允许在少数文件上不同——脱敏开关 (packages/core/src/privacy/config.ts)、应用身份(tauri.conf.json 的 identifier 与 productName)、demo 专属文档与脚本。镜像改动只按文件摘取(git checkout <sha> -- <files> 后在发布线单独提交),不得 merge 或快进把 demo 合入发布线:demo 的脱敏开关与 app.onethu.demo 身份会一并进入正式版(2026-09-21 的实际事故)。

门禁:node tools/release-line-check.mjs 检查 git 引用,--worktree 在镜像提交前自查工作区。

7. 提交前自检

pnpm typecheck                                  # 全包类型检查
pnpm lint:ui-copy                               # 用户可见文案纪律(见「UI 文案与信息密度」)

node --import ./tools/ts-resolve-register.mjs tools/plugin-ui-test.mjs   # 需要编译 TS 的测试
node tools/exthw-status-test.mjs                                          # 纯 JS 测试

cd apps/desktop/src-tauri && cargo check && cargo test --lib              # Rust 侧
cd apps/desktop/src-tauri/gen/android && ./gradlew :tauri-plugin-onethu-mobile:compileDebugKotlin

tools/ 下的测试脚本覆盖通知编排、小组件快照与原生重画、外部作业源状态、插件 UI 逻辑、 主题联动、市场名单解析等链路,是改动的第一道检查。完整命令清单(含 Android 目标交叉检查、 macOS 通知探针、Windows 通知模块编译检查)见 系统架构 §8。

8. 常见构建陷阱

陷阱 现象 处理
在 exFAT / 网络卷上构建 链接与权限错误、构建产物异常 将产物目录指向本地磁盘
Android 工程放在 exFAT / 网络卷上 Gradle 将 ._* 副档当作真实条目,报 is not a directory 或 Failed to delete some children 工程置于内盘(APFS),再以符号链接挂回
工程经符号链接后 rootDirRel 解析到仓库之外 npm 在错误目录找不到 package.json app/build.gradle.kts 改用绝对路径
Gradle 调 cargo 时工作目录为 apps/desktop 落回外置卷的 target,build.rs 读到 ._*.toml 而 panic 以 CARGO_TARGET_DIR 强制覆盖
新增 Tauri Android 命令参数类缺少 @InvokeArg release 包调用即抛 no Creators,debug 包正常 参数类必须加注解,并在 release 包上真机验证
XML 注释中出现 -- AAPT 资源解析失败 注释内不写连续短横线
res/ 下出现 ._* 文件 AppleDouble 被当作资源 构建前执行 find res -name '._*' -delete
以裸 UA 字符串判定安卓 主窗口伪装导致判定恒为假 改用多信号判定,见对应文档

成因、复现与取证通道见 安卓 release 陷阱与取证。

9. 文档站自身的构建

本站(onethu.github.io 的 /docs/ 路径)由 Material for MkDocs 构建,正文同步自主仓 docs/:

python3 tools/sync-docs.py ../OneTHU/docs    # 主仓文档 → docs-src/(本仓库预览用;CI 检出主仓)
bash tools/docs-serve.sh         # 本地预览 http://127.0.0.1:8000

构建与部署细节(Pages 托管、定时重建、依赖锁定)见 本站仓库 README。