本文档介绍了 Deno 的命令行接口 (CLI) 架构,包括参数解析、命令分派、服务创建和工作进程初始化。有关运行时架构和 JavaScript 执行环境的信息,请参阅 运行时架构。有关特定工具和子命令的详细信息,请参阅 开发者工具。
Deno CLI 采用分层架构,主入口点处理命令行参数,分派到适当的子命令处理程序,并创建工作进程来执行 JavaScript 代码。该架构使用工厂模式进行服务创建和依赖注入,确保昂贵的资源仅在需要时进行初始化。
命令行处理流程
CLI 处理从 `main()` 开始,经过参数解析,然后执行子命令。每个子命令都在单独的任务中启动,以防止堆栈溢出问题。
来源:cli/main.rs453-513 cli/main.rs515-555 cli/args/flags.rs647-690 cli/args/flags.rs468-502
CLI 使用 `clap` 库来结构化地处理参数,将标志和子命令组织到类型化的结构中。
参数解析结构
参数解析系统使用强类型结构来表示不同的命令配置,确保整个 CLI 的类型安全。
来源:cli/args/flags.rs647-690 cli/args/flags.rs468-502 cli/args/flags.rs692-733
CLI 通过一个集中的路由系统分派不同的子命令,该系统将命令类型映射到其各自的处理程序。
子命令分派架构
每个子命令由 `tools` 命名空间中的专用模块处理,并对语言服务器协议 (LSP) 功能进行特殊处理。
来源:cli/main.rs111-368 cli/main.rs102-109
CLI 在 `CliFactory` 中使用工厂模式实现,以管理整个应用程序的服务创建和依赖注入。
工厂模式架构
工厂使用延迟初始化来避免在真正需要之前创建昂贵的资源,从而提高 CLI 的启动性能。
来源:cli/factory.rs256-300 cli/factory.rs302-783
CLI 创建不同类型的工作进程来执行 JavaScript 代码,主工作进程是主要的执行环境。
工作进程创建架构
工作进程创建系统为不同的执行上下文提供了不同的工作进程类型,共享的服务依赖通过工厂模式进行管理。
来源:cli/worker.rs314-442 runtime/worker.rs174-219 runtime/worker.rs359-377
CLI 从多种来源处理配置,包括命令行标志、配置文件和环境变量。
| 配置源 | 优先级 | 处理方式 |
|---|---|---|
| 命令行标志 | 最高 | flags_from_vec() |
| 环境变量 | 中等 | load_env_variables_from_env_file() |
| 配置文件 (deno.json) | 最低 | CliOptions::from_flags() |
`CliOptions` 结构体作为中央配置对象,整合所有配置来源,并在应用程序中提供对设置的类型化访问。
来源:cli/args/mod.rs369-411 cli/args/flags.rs533-555
CLI 通过自定义 panic 钩子和优雅的错误报告实现了全面的错误处理。
错误处理流程
CLI 设置了自定义 panic 钩子,以提供更好的错误消息,并包含调试信息,帮助用户有效地报告问题。