本文档涵盖了 Deno 的构建系统架构、持续集成管道和发布管理流程。它重点介绍了 Rust 工作区配置、GitHub Actions 工作流和自动化发布工具。
有关 CLI 架构和命令处理的信息,请参阅 CLI 架构。有关运行时引导和 JavaScript 环境设置的详细信息,请参阅 运行时架构。
Deno 使用 Cargo 工作区来管理其多 crate 结构。工作区定义在根目录的 `Cargo.toml`,包含几大类 crate。
工作区在 `Cargo.toml`56-524 定义了共享依赖项,并在 `Cargo.toml`389-524 定义了构建配置文件。
来源: `Cargo.toml`3-47 `cli/Cargo.toml`4-5 `runtime/Cargo.toml`4-5
CI 系统围绕 GitHub Actions 构建,拥有一个动态生成的 CI 主工作流。该配置通过 TypeScript 管理,并生成实际的 YAML 工作流文件。
主 CI 工作流由 `.github/workflows/ci.generate.ts` 生成,它定义了
来源: `.github/workflows/ci.generate.ts1-8 `.github/workflows/ci.yml1-2
CI 系统在多个平台上运行不同类型的作业
| 作业类型 | 平台 | 配置文件 | 特性 |
|---|---|---|---|
测试 | Linux x86_64, macOS x86_64/ARM64, Windows x86_64 | debug/release | 核心功能测试 |
lint | Linux x86_64, macOS x86_64, Windows x86_64 | debug | 代码质量检查 |
bench | Linux x86_64 | release | 性能基准测试 |
Linux 构建使用在 `.github/workflows/ci.generate.ts82-163 中配置的 sysroot 环境进行构建,并使用
clang-19 和 lld-19 进行链接来源: `.github/workflows/ci.generate.ts82-163 `.github/workflows/ci.yml263-343
构建系统使用 Cargo 功能和配置来控制编译
CLI crate 在 `cli/Cargo.toml`34-52 定义了几个重要功能。
工作区在 `Cargo.toml`389-524 定义了优化的构建配置。
" undefined file-path="lto = "thin"`">Hii 加快编译速度单个 crate 在 `Cargo.toml`416-524 中定义了自定义优化设置,以平衡构建时间和性能。
来源: `cli/Cargo.toml`34-52 `Cargo.toml`389-524
Deno 拥有一个通过 GitHub Actions 工作流和 TypeScript 自动化脚本管理的自动化发布流程。
版本升级流程由 `tools/release/01_bump_crate_versions.ts` 处理。
发布流程使用依赖排序,来自 `tools/release/03_publish_crates.ts
这确保了依赖项在依赖项之前发布,以避免构建失败。
来源: `tools/release/01_bump_crate_versions.ts1-155 `tools/release/03_publish_crates.ts14-16 `.github/workflows/cargo_publish.yml42-55
CI 系统采用了多种缓存策略来缩短构建时间。
中的缓存配置 `.github/workflows/ci.generate.ts504-522 包含
${cacheVersion}-cargo-home-${os}-${arch}-${Cargo.lock hash}对于 Linux 系统根构建,系统配置了增量 LTO 缓存。
这允许跨构建重用链接时间优化工作。
来源: `.github/workflows/ci.generate.ts504-522 `.github/mtime_cache/action.js1-30 `.github/workflows/ci.generate.ts142-143
Windows 二进制文件使用 Azure Key Vault 集成进行代码签名。
签名过程在 `.github/workflows/ci.yml649-677 中配置,并使用 GitHub OIDC 进行 Azure 身份验证。
macOS 构建使用 rcodesign 和 Apple 证书。
来源: `.github/workflows/ci.yml649-677 `.github/workflows/ci.yml500-503