此页面记录了 Tabby 的构建和部署流程,解释了该应用程序如何跨多个平台进行编译、打包和分发。有关设置开发环境的信息,请参阅开发指南和设置开发环境。
Tabby 使用强大的构建和部署系统,支持多个平台(Windows、macOS、Linux)和架构(x64、arm64、armhf)。构建过程通过 Webpack 进行打包,并使用 Electron Builder 创建平台特定的安装程序和便携式软件包,将 TypeScript 源代码转换为可分发软件包。整个过程通过 GitHub Actions 工作流自动化,这些工作流负责应用程序的构建、测试、签名和分发。
构建和部署架构
来源: package.json102-115 .github/workflows/build.yml1-421
Tabby 的构建系统通过两个独立的 package.json 文件进行配置
package.json - 包含整个项目的开发依赖和构建脚本app/package.json - 定义了实际被打包和分发的应用程序根目录 package.json 中的关键构建脚本
| 脚本 | 目的 |
|---|---|
build | 构建类型定义和模块 |
build:typings | 生成 TypeScript 类型定义 |
watch | 监视更改并重新构建(开发模式) |
start | 在开发模式下运行应用程序 |
docs | 构建 API 文档 |
lint | 运行 ESLint 检查代码质量 |
关键依赖项
| 类别 | 依赖项 |
|---|---|
| 框架 | Angular, RxJS |
| 构建工具 | Webpack, TypeScript, Electron Builder |
| Electron | electron, @electron/rebuild |
| UI | Bootstrap, FontAwesome |
| 测试 | ESLint |
来源: package.json2-94 app/package.json17-46
来源: package.json1 app/package.json1 .github/workflows/build.yml1 .github/workflows/docs.yml1
构建过程通过多个阶段将 TypeScript 源代码转换为平台特定软件包。
对于本地开发,Tabby 使用 Webpack 的监视模式,在代码更改时持续重新编译。
来源: package.json105-106 app/package.json14-15
生产构建过程涉及多个阶段
来源: package.json103-104 .github/workflows/build.yml70-83 .github/workflows/build.yml226-230 .github/workflows/build.yml344-347
Tabby 使用 GitHub Actions 进行持续集成和部署,并为构建软件包和文档设置了独立的工作流。
来源: .github/workflows/build.yml1-421
CI 流水线使用构建矩阵为所有受支持的平台和架构构建 Tabby
| 作业 | 平台 | 架构 |
|---|---|---|
macOS 构建 | macOS | x86_64, arm64 |
Linux 构建 | Linux | x64, arm64, armhf |
Windows 构建 | Windows | x64,arm64 |
来源: .github/workflows/build.yml34-46 .github/workflows/build.yml132-151 .github/workflows/build.yml300-310
每个平台构建作业都会生成多种类型的软件包
Windows 软件包
macOS 软件包
Linux 软件包
来源: .github/workflows/build.yml114-129 .github/workflows/build.yml263-298 .github/workflows/build.yml404-420
对于正式发布(由标签触发),软件包会进行签名以确保真实性
macOS 构建使用 Apple 开发者证书签名,并经 Apple 公证服务公证。
来源: .github/workflows/build.yml82-94
Windows 构建使用 DigiCert 的 Software Trust Manager 进行签名
来源: .github/workflows/build.yml322-386
当标签被推送到仓库时,发布过程会自动触发
来源: .github/workflows/build.yml84 .github/workflows/build.yml254 .github/workflows/build.yml324
Tabby 通过多个渠道分发
| 渠道 | 包类型 | 触发器 |
|---|---|---|
| GitHub 发布 | 所有软件包类型 | Git 标签 |
| packagecloud.io | Linux (.deb, .rpm) | Git 标签 |
| Keygen | 更新服务 | Git 标签 |
来源: .github/workflows/build.yml252-261 .github/workflows/build.yml87 .github/workflows/build.yml378
Linux 软件包通过 packagecloud.io 分发,支持多种发行版
Debian/Ubuntu:
基于 RPM 的:
来源: .github/workflows/build.yml258-261
Tabby 在生产环境中使用 Sentry 进行错误追踪。调试符号在构建过程中上传,以实现正确的堆栈跟踪符号化。
来源: .github/workflows/build.yml104-111 .github/workflows/build.yml242-250 .github/workflows/build.yml394-401
API 文档自动生成并部署到 Firebase Hosting
来源: .github/workflows/docs.yml1-40 firebase.json1-10 package.json109
常见的构建问题及解决方案
| 问题 | 解决方案 |
|---|---|
| 原生模块编译错误 | 更新 node-gyp 或运行 yarn postinstall 以重新构建原生依赖项 |
| 代码签名失败 | 确保为签名证书设置了正确的环境变量 |
| 缺少依赖项 | 构建前运行 yarn 安装依赖项 |
| 交叉编译问题 | 为目标架构使用正确的工具链 |
| 构建过程中内存不足 | 使用 NODE_OPTIONS=--max_old_space_size=4096 增加 Node.js 内存限制 |
来源: package.json111 .github/workflows/build.yml45-48 .github/workflows/build.yml155-161