OpenHuman 构建指南:基于 Tauri 的全平台桌面与移动端打包实战
OpenHuman 构建指南基于 Tauri 的全平台桌面与移动端打包实战【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman导读OpenHuman 是一个面向 macOS、Windows 与 Linux 的开源个人 AI 应用其桌面端与移动端外壳基于 Tauri 2 构建。本文以仓库内 .claude/agents/build-agent.md 中定义的构建 Agent 职责为主线完整梳理 OpenHuman 从开发构建、生产打包到代码签名与优化配置的完整链路你将掌握桌面端Windows/macOS/Linux与移动端Android/iOS的构建命令、tauri.conf.json与 Cargo release profile 的真实配置细节、签名所需的全部环境变量以及常见构建故障的排查方法。构建 Agent 的角色定位在 OpenHuman 的仓库协作体系中.claude/agents/build-agent.md定义了一个专门负责“构建与打包”任务的 Agentname: build-agent默认模型sonnet其核心职责可以概括为四条为所有目标平台构建并打包 Tauri 应用桌面端 Windows / macOS / Linux构建移动端应用Android / iOS配置构建选项与优化参数处理代码签名Code Signing与公证Notarization。也就是说只要你在仓库中发起“帮我打个 Windows 安装包”或“跑一次 iOS 真机构建”之类的任务这个 Agent 就会按照本文描述的路径去执行。文章后续所有命令与配置均可以在仓库对应文件中找到真实依据。桌面端构建开发与生产开发构建npm run tauri dev该命令启动 Tauri 开发模式Tauri 会先执行tauri.conf.json中配置的beforeDevCommand本仓库为pnpm run dev即启动 Vite 前端开发服务器随后以热更新方式加载devUrlhttp://localhost:1420对应的前端页面Rust 侧改动会自动触发增量编译。由于 OpenHuman 的 Tauri 外壳内嵌了完整的 Rust core crate见 app/src-tauri/Cargo.toml 中openhuman_core依赖开发构建的依赖图很大仓库专门配置了[profile.dev.package.*] debug false来为第三方依赖关闭调试信息以加快本地与 CI 的编译速度。生产构建# 构建当前平台的生产包 npm run tauri build # 指定目标平台构建 npm run tauri build -- --target x86_64-pc-windows-msvc npm run tauri build -- --target universal-apple-darwin npm run tauri build -- --target x86_64-unknown-linux-gnu生产构建时Tauri 会先执行beforeBuildCommand本仓库为pnpm run build:app随后把打包好的前端产物frontendDist指向../dist通过custom-protocol特性以tauri://localhost协议内嵌进应用。这一点在 app/src-tauri/Cargo.toml 有明确注释custom-protocol不能放进default特性否则每次pnpm dev:app都会静默加载生产包cargo tauri build会在 release 构建时自动开启它。在 OpenHuman 仓库中桌面端与移动端是两个独立的 Cargo 世界各自拥有Cargo.lock与target/桌面主机在app/src-tauri/移动主机在app/src-tauri-mobile/根目录Cargo.toml则是被内嵌的 core crate 本体。因此桌面构建真正执行的产物定义位于 app/src-tauri/tauri.conf.json。真实打包目标不止“all”原文档示例中bundle.targets写作all而 OpenHuman 实际使用显式目标列表见 app/src-tauri/tauri.conf.jsonbundle: { active: true, targets: [ app, dmg, deb, nsis, msi, appimage ], icon: [ icons/32x32.png, icons/128x128.png, icons/128x1282x.png, icons/icon.icns, icons/icon.ico ], createUpdaterArtifacts: false }macOS产出.app与.dmgminimumSystemVersion为 12.3并配置了entitlements.sidecar.plist与Info.plistWindows产出.msiMSI 安装包与.nsisNSIS 安装包NSIS 侧挂接了nsis-hooks.nsh安装钩子Linux产出.deb与.appimage其中 deb 包在配置中显式声明了一组运行时依赖libwebkit2gtk-4.1-0、libgtk-3-0、libnss3、libgbm1等并指定了main.desktop桌面模板与postinst/postrm维护脚本。此外OpenHuman 在桌面包中还启用了两个关键插件updater自动更新插件内置了公钥pubkey与更新端点配合tauri-plugin-updater负责.app/.exe/.AppImage外壳的更新core 侧边车另有独立的更新机制deep-link注册openhuman://深链协议用于 OAuth 回调等场景。图标方面src-tauri/icons/目录下必须同时存在32x32.png、128x128.png、128x1282x.png、icon.icnsmacOS与icon.icoWindows——这正是原文档 Troubleshooting 第 2 条“Icon errors: Ensure all icon sizes exist”的由来。移动端构建Android 与 iOS常用命令# Android npm run tauri android build npm run tauri android build -- --debug npm run tauri android build -- --target aarch64 # iOS npm run tauri ios build npm run tauri ios build -- --debug在 OpenHuman 中这些命令实际由 app/package.json 中的脚本承接且移动端构建使用的是独立的src-tauri-mobile目录tauri:ios:dev/tauri:ios:buildcd src-tauri-mobile IPHONEOS_DEPLOYMENT_TARGET${IPHONEOS_DEPLOYMENT_TARGET:-16.0} npx --packagetauri-apps/cli^2 tauri ios ...tauri:android:dev/tauri:android:build同样cd src-tauri-mobile后调用tauri android ...仓库还提供了初始化脚本tauri:ios:initbash scripts/ios-init.sh与tauri:android:initbash scripts/android-init.sh。移动端配置的差异化移动端主机的配置见 app/src-tauri-mobile/tauri.conf.json与桌面端有几点明显差异app: { windows: [ { label: main, title: OpenHuman, width: 390, height: 844, decorations: true, resizable: false } ] }, bundle: { active: true, targets: [app], icon: [icons/icon.png], iOS: { minimumSystemVersion: 16.0, frameworks: [AVFoundation.framework, Speech.framework], developmentTeam: }, android: { minSdkVersion: 24 } }要点移动端窗口被固定为 390×844iPhone 逻辑尺寸且不可缩放iOS 最低系统版本 16.0并显式链接了AVFoundation音视频采集与Speech语音识别框架AndroidminSdkVersion为 24Android 7.0移动端只产出app目标。从 app/src-tauri-mobile/Cargo.toml 可以进一步看到平台差异iOS 与 Android 都引入tauri-plugin-barcode-scanner二维码扫描而 iOS 额外引入packages/tauri-plugin-ptt按住说话Push-to-Talk含 Swift 原生实现Android 端 PTT 会返回NotSupported。注意移动端 Cargo 世界被刻意设计为“仅 iOS/Android 可编译”避免被误拉进桌面构建。构建配置总览tauri.conf.json 的完整字段原文档只给出了最简bundle片段OpenHuman 的真实桌面配置要丰富得多值得完整拆解app/src-tauri/tauri.conf.json字段实际值作用productName/versionOpenHuman/0.63.22产物名称与版本号identifiercom.openhuman.app应用唯一标识影响更新与签名build.beforeDevCommandpnpm run dev开发模式前端启动命令build.devUrlhttp://localhost:1420开发模式加载地址build.beforeBuildCommandpnpm run build:app生产构建前端构建命令build.frontendDist../dist生产模式内嵌的前端产物目录app.windows1280×900titleBarStyle: Overlay、trafficLightPosition主窗口尺寸、隐藏标题栏与 macOS 红绿灯按钮位置app.security.csp见文件CSP 白名单涵盖ipc:、tauri:、Google Analytics 等来源app.macOSPrivateApitrue启用 macOS 私有 API配合 Overlay 标题栏bundle.resources../../src/openhuman/agent/prompts打包时把 Rust core 的 Agent 提示词目录带入产物plugins.updater公钥 端点自动更新plugins.deep-linkopenhumanscheme深链其中 CSP 与窗口配置属于“构建时即固化”的运行时安全边界改动它们直接影响打包产物行为是构建 Agent 需要重点关注的配置面。Release 优化设置以仓库真实 Profile 为准原文档给出了一个通用化的优化模板panic abort、codegen-units 1、lto true、opt-level s、strip true。需要说明的是OpenHuman 仓库当前实际的 release profile 与该模板不同它经过了多轮针对二进制体积与构建时间的实测调优分布在三个 Cargo 世界且保持同步。桌面端app/src-tauri/Cargo.toml[profile.release] debug line-tables-only split-debuginfo packed lto thin codegen-units 16 strip symbols根目录 core crateCargo.toml的注释给出了完整的权衡依据lto thincore crate 跨约 379 个包编译约 12 万个方法默认 16 个 codegen unit 会反复生成重复的 async 状态机代码实测同一闭包在cargo bloat中出现 6 次、每次约 40 KBThin LTO 可将其去重codegen-units 16从 1 上调至 16。原方案codegen-units 1虽能最大化 LTO 效果却让桌面 release 矩阵构建时间 82% 并阻塞发布issue #5595最终折中为 16strip symbols去掉约 32 MB 的符号表debug line-tables-onlysplit-debuginfo packedrelease 包仍然保留行号级别的 DWARF 信息供 Sentry 服务端符号化崩溃堆栈且 dSYM 与可执行文件分离保证产物本体精简。若符号文件缺失scripts/upload_sentry_symbols.sh会直接失败issue #1403从而避免“静默丢符号”的问题。移动端app/src-tauri-mobile/Cargo.toml采用与桌面端完全一致的三件套。此外桌面端还定义了[profile.ci]继承 releaseopt-level 1、lto false、incremental false用于 CI 上牺牲运行性能换取最快编译速度。从源码结构还可以推断三个 Cargo 世界的 release 设置是人工同步维护的Cargo.toml 注释中多次出现“kept in sync with the root Cargo.toml”改动任何一处都需同步另外两处这是构建 Agent 修改优化参数时必须遵守的纪律。签名、公证与环境变量原文档的环境变量表在 OpenHuman 中全部适用且与仓库内的签名脚本一一对应变量用途对应仓库脚本TAURI_SIGNING_PRIVATE_KEY签名私钥用于 Tauri updater 签名scripts/release/tauri-signer.shTAURI_SIGNING_PRIVATE_KEY_PASSWORD私钥密码同上APPLE_DEVELOPMENT_TEAMiOS/macOS 团队 IDdevelopmentTeamscripts/release/sign-and-notarize-macos.shANDROID_HOMEAndroid SDK 路径scripts/android-init.shNDK_HOMEAndroid NDK 路径scripts/android-init.sh在此基础上OpenHuman 还使用了一些构建期环境变量值得一并了解IPHONEOS_DEPLOYMENT_TARGETiOS 部署目标未设置时默认取 16.0见 app/package.jsonOPENHUMAN_TAURI_SENTRY_DSN编译期通过option_env!注入 Tauri 外壳的 Sentry DSN运行时可用同名环境变量覆盖见 app/src-tauri/Cargo.toml 的 sentry 依赖注释。macOS 的完整签名与公证链路由sign-and-notarize-macos.sh驱动先签名.app再制作并签名.dmg最后提交 Apple 公证。Windows 侧的 NSIS 安装钩子nsis-hooks.nsh与 Linux deb 维护脚本postinst/postrm也都在打包时参与产物定制。Troubleshooting构建故障排查原文档给出了三条通用排查路径结合仓库实际情况可以展开为更可操作的清单构建失败Build fails确认 Rust 工具链与平台 SDK 齐全。OpenHuman 使用rust-toolchain.toml固定工具链版本Linux 桌面构建依赖 WebKitGTKdeb 包依赖表里的libwebkit2gtk-4.1-0等即是运行时证据macOS 构建需要 Xcode 与 Command Line ToolsWindows 需要 MSVC Build Tools。可先运行cargo check --manifest-path app/src-tauri/Cargo.toml或pnpm rust:check快速定位编译错误。图标错误Icon errors检查app/src-tauri/icons/下是否同时存在配置中引用的全部尺寸与格式32x32.png、128x128.png、128x1282x.png、icon.icns、icon.ico移动端则只需icons/icon.png。任何一个缺失都会导致tauri build在打包阶段失败。签名问题Signing issues验证证书与 provisioning profile 是否有效、APPLE_DEVELOPMENT_TEAM是否与描述文件匹配、TAURI_SIGNING_PRIVATE_KEY是否与 updater 公钥配对macOS 上还需确认 Keychain 中证书可被命令行访问。此外还有 OpenHuman 特有的两个排查点一是 release 优化参数在三个 Cargo 世界根目录 / 桌面 / 移动端必须保持一致改动一处不同步会在某个平台构建时出现体积或性能回退二是custom-protocol特性一旦误入default开发模式会静默加载生产包表现为“改了前端不生效”。小结OpenHuman 的构建体系可以用“一套 Tauri、三个 Cargo 世界、两个平台族”来概括桌面端Windows/macOS/Linux与移动端Android/iOS共用同一套 React 前端但分别由app/src-tauri/与app/src-tauri-mobile/两个独立的主机 crate 承载release 优化配置以实测数据为依据在三个世界中同步维护签名、公证、更新与深链等发布能力则固化在tauri.conf.json的插件与 bundle 配置中。对构建 Agent 或任何需要为 OpenHuman 产出安装包的开发者而言以 .claude/agents/build-agent.md 为入口、以 app/src-tauri/tauri.conf.json 与 app/src-tauri/Cargo.toml 为事实基准就能完整复现从npm run tauri dev到各平台签名分发物的全流程。【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考