C# (.NET) 的 CLI 框架:System.CommandLine 和 Cocona
在 C# 中创建控制台应用程序 (CLI) 长期以来一直与通过 string[] args 手动解析命令行参数以及繁琐的条件结构相关联。然而,随着 .NET 生态系统的发展,出现了专门的框架,它们承担了日常繁琐的工作:参数解析、帮助生成、验证,甚至依赖注入 (DI)。在本文中,我们将探讨两种最流行的方法:微软官方的 System.CommandLine 和轻量但功能强大的 Cocona。
这两种工具都允许您编写简洁、声明式的代码,这些代码易于维护和测试。您将学习如何快速将它们添加到项目中,定义命令和参数,并查看实际的代码示例。
1. System.CommandLine
System.CommandLine 是微软的官方库,是 .NET SDK(从 .NET 6 开始)的一部分。它提供了一套完整的功能,用于构建复杂的 CLI 应用程序:嵌套命令、Tab 键自动补全、验证、异步处理程序和帮助生成。
安装
通过 NuGet 添加包:
dotnet add package System.CommandLine --version 2.0.0-beta4.22272.1示例:具有两种操作的計算器
让我们创建一个简单的应用程序,它接受 add 或 multiply 命令以及两个数字:
using System.CommandLine;
// 定义根命令var rootCommand = new RootCommand("简单计算器");
// 创建子命令 "add"var addCommand = new Command("add", "两个数相加");var addXOption = new Option<int>("--x", "第一个数字") { IsRequired = true };var addYOption = new Option<int>("--y", "第二个数字") { IsRequired = true };addCommand.AddOption(addXOption);addCommand.AddOption(addYOption);
addCommand.SetHandler((x, y) =>{ Console.WriteLine($"相加结果: {x + y}");}, addXOption, addYOption);
// 创建子命令 "multiply"var multiplyCommand = new Command("multiply", "两个数相乘");var multXOption = new Option<int>("--x", "第一个数字") { IsRequired = true };var multYOption = new Option<int>("--y", "第二个数字") { IsRequired = true };multiplyCommand.AddOption(multXOption);multiplyCommand.AddOption(multYOption);
multiplyCommand.SetHandler((x, y) =>{ Console.WriteLine($"相乘结果: {x * y}");}, multXOption, multYOption);
// 将命令添加到根命令rootCommand.AddCommand(addCommand);rootCommand.AddCommand(multiplyCommand);
// 运行await rootCommand.InvokeAsync(args);运行应用程序:
dotnet run -- add --x 5 --y 3# 输出: 相加结果: 8
dotnet run -- multiply --x 4 --y 7# 输出: 相乘结果: 28System.CommandLine 的关键特性
- 自动补全 — 内置对 bash 和 PowerShell 的 Tab 键补全支持。
- 帮助生成 —
--help标志会自动生成所有命令和选项的描述。 - 验证 — 可以设置必需参数、值范围和自定义检查。
- 异步 — 处理程序支持
async Task。 - 测试 — 使用
TestConsole可以轻松编写单元测试。
2. Cocona
Cocona 是一个替代框架,它通过属性和自动参数绑定提供了更简洁的语法。它非常适合中小型项目,在这些项目中开发速度至关重要。Cocona 支持 DI、中间件和嵌套命令。
安装
dotnet add package Co