菜单

Cargo 设置

相关源文件

本文档涵盖了 Deno 项目的 Rust 工作空间配置、依赖管理和构建系统设置。它解释了项目如何使用 Cargo 工作空间进行组织,如何在多个 crate 之间管理依赖项,以及用于开发和发布构建的构建配置。

有关构建这些 Cargo 配置的 CI/CD 管道的信息,请参阅 CI 工作流

工作空间架构

Deno 使用 Cargo 工作空间来管理其多 crate 架构。工作空间配置为解析器版本 2,并将代码库组织成几个逻辑分组。

工作空间结构

该工作空间定义了 47 个成员 crate,它们提供了 Deno 功能的不同方面。主要类别包括核心功能、Web 标准扩展、Node.js 兼容性和测试基础设施。

来源:Cargo.toml3-47

工作空间包元数据

通用包元数据集中在工作空间级别,以确保所有 crate 的一致性。各个 crate 使用 workspace = true 语法继承这些设置。

来源:Cargo.toml50-54

依赖管理

工作区依赖项

Deno 使用 [workspace.dependencies] 集中管理依赖项,以确保所有 crate 的版本一致性。这包括内部 Deno crate 和外部依赖项。

依赖类别示例 Crates版本策略
核心 Deno Cratesdeno_coredeno_ast带有 = 的精确版本
外部工具tokioserdehyper兼容版本
加密库ringrustlsaes由工作空间管理
Web 标准httpurlmime最新兼容

依赖项规范对关键组件使用了精确版本锁定

来源:Cargo.toml56-524

扩展依赖

每个扩展都遵循一个通用模式,即依赖工作空间中的 deno_coredeno_error,以及特定于域的外部依赖项。

来源:ext/http/Cargo.toml25-58 ext/crypto/Cargo.toml16-49

构建配置

发布优化策略

构建系统使用多个配置来针对不同的用例进行优化

  • 发布:最大化优化,支持 LTO 和大小优化(opt-level = 'z'
  • 发布-带调试信息:发布性能,带有调试符号
  • 发布-精简:通过 lto = "thin"codegen-units = 128 加快编译速度

关键性能包,如 v8tokiodeno_core,即使在调试构建中也被强制设置为 opt-level = 3

来源:Cargo.toml389-524

开发配置覆盖

某些特定包在调试构建中也需要优化

原因优化
v8V8 在 -O0 时会错误编译opt-level = 1
num-bigint-dig加密密钥生成过慢opt-level = 3

来源:Cargo.toml408-414

CLI Crates 配置

主二进制设置

CLI Crates 定义了主 deno 二进制文件,并包含集成测试和带有自定义 harness 的基准测试。

来源:cli/Cargo.toml14-32

功能标志

功能目的依赖项
upgrade启用升级子命令默认启用
dhat-heapLinux 上的堆分析可选 dhat
hmr热模块重载deno_runtime/hmr
__vendored_zlib_ng供应商 zlib-ngflate2/zlib-ng-compat
lsp-tracingLSP 遥测tracing-* Crates

来源:cli/Cargo.toml34-52

运行时 Crates 配置

功能系统

运行时 Crates 使用复杂的特性系统来控制 JavaScript 源的包含和转译功能。

来源:runtime/Cargo.toml12-31

扩展系统依赖

通用依赖模式

扩展遵循一致的依赖模式

来源:ext/http/Cargo.toml25-58 ext/crypto/Cargo.toml16-49 ext/net/Cargo.toml16-36 ext/node/Cargo.toml19-106

平台特定依赖项

几个扩展包含特定于平台的依赖项

平台扩展依赖项
Unixdeno_nodeerrno = "0.3.10"
Windowsdeno_nodewindows-syswinapi
Linux/macOSdeno_nettokio-vsock

来源:ext/node/Cargo.toml101-106 ext/net/Cargo.toml35-36

锁文件管理

Cargo.lock 文件固定了所有传递性依赖项的精确版本,以确保可重复构建。它拥有超过 1200 个依赖项条目,为整个工作空间提供了完整的依赖解析。

主要特性

  • 版本 4 锁文件格式
  • 包含校验和以确保安全
  • 管理复杂的依赖树,包括某些 crate 的多个版本
  • 自动更新,但会提交到版本控制

来源:Cargo.lock1-4