如何为自定义dotnet CLI工具添加-name、-place类自定义命令选项
.NET CLI工具自定义命令选项实现方案
你已经配置了<ToolCommandName>helloworld</ToolCommandName>实现了命令直接调用,要支持-name、-place这类自定义选项,有两种成熟的实现方式:
方式一:原生解析启动参数(无额外依赖)
.NET控制台应用默认会把用户输入的所有命令行参数传入程序入口Main方法的string[] args数组,直接遍历这个数组就能提取对应选项的值,不需要引入任何第三方包:
- 修改程序入口的参数处理逻辑,参考代码如下:
// 先给参数设置默认值 string name = "陌生人"; string place = "未知地点"; // 遍历传入的参数数组做解析 for (int i = 0; i < args.Length; i++) { switch (args[i]) { case "-name": // 校验索引防止越界,选项后紧跟的就是对应的参数值 if (i + 1 < args.Length) { name = args[i + 1]; i++; // 跳过已经读取的参数值,避免重复解析 } break; case "-place": if (i + 1 < args.Length) { place = args[i + 1]; i++; } break; // 后续新增选项直接按相同格式追加case即可 } } // 业务逻辑,这里可以替换成你自己的处理代码 Console.WriteLine($"你好 {name},欢迎来到 {place}!");
- 重新打包、安装更新后的CLI工具,执行
helloworld -name mark -place Virginia就能正确读取到传入的两个参数。
这种方式适合参数少、逻辑简单的小型工具,所有解析逻辑完全可控。如果需要支持帮助文档自动生成、参数类型校验、子命令等复杂能力,自己写解析逻辑会很繁琐,推荐用下面的官方库方案。
方式二:使用System.CommandLine实现(官方推荐,适配复杂场景)
System.CommandLine是微软官方维护的命令行解析库,内置了参数解析、校验、帮助文档生成、tab补全等常用CLI能力,不需要自己写遍历解析的重复代码:
- 首先给项目安装对应的NuGet包,在项目目录执行命令:
dotnet add package System.CommandLine
- 修改程序逻辑,定义选项、绑定处理逻辑即可,参考代码(兼容.NET 6+顶级语句写法):
using System.CommandLine; // 定义-name选项,指定参数类型、描述、默认值 var nameOption = new Option<string>( "-name", description: "指定要问候的用户名称", getDefaultValue: () => "陌生人" ); // 定义-place选项 var placeOption = new Option<string>( "-place", description: "指定地点名称", getDefaultValue: () => "未知地点" ); // 初始化根命令,挂载自定义选项 var rootCommand = new RootCommand("helloworld 测试CLI工具"); rootCommand.AddOption(nameOption); rootCommand.AddOption(placeOption); // 绑定命令执行逻辑,解析完成的参数会自动传入委托 rootCommand.SetHandler((string name, string place) => { // 这里写你的业务逻辑 Console.WriteLine($"你好 {name},欢迎来到 {place}!"); }, nameOption, placeOption); // 启动命令行解析流程 return rootCommand.Invoke(args);
- 重新打包安装工具后,除了支持你需要的
helloworld -name mark -place Virginia调用形式,还会自动支持helloworld --help查看使用说明、参数类型错误提示、缺省参数自动填充默认值等能力,不需要额外开发。
内容的提问来源于stack exchange,提问作者Abhicruiser
相关产品推荐
相关产品推荐

