如何在C#的System.CommandLine中重写或移除默认--version选项?
重写System.CommandLine中--version的默认行为
在使用System.CommandLine时,默认的--version选项只显示应用自身版本,满足不了技术支持需要的详细信息(比如.NET运行时版本、插件版本等),可以通过以下两种方式修改:
方法一:移除默认选项,自定义新的--version
先把框架自带的--version选项删掉,再自己加一个带自定义逻辑的同名选项:
using System.CommandLine; using System.CommandLine.Builder; using System.CommandLine.Parsing; using System.Reflection; var rootCommand = new RootCommand("你的应用功能描述"); // 定位并移除默认的--version选项 var defaultVersionOpt = rootCommand.Options.FirstOrDefault(o => o.Name == "version"); if (defaultVersionOpt != null) { rootCommand.RemoveOption(defaultVersionOpt); } // 添加自定义的--version选项 var customVersionOpt = new Option<bool>("--version", "显示包含运行时、插件的详细版本信息"); rootCommand.AddOption(customVersionOpt); // 绑定自定义处理逻辑 rootCommand.SetHandler((showVersion) => { if (showVersion) { // 获取应用版本 var appVer = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "未知版本"; // 获取当前.NET运行时版本 var runtimeVer = Environment.Version.ToString(); // 实际项目中替换成真实的插件版本获取逻辑 var pluginVersions = new Dictionary<string, string> { ["支付插件"] = "2.1.0", ["日志插件"] = "1.5.3" }; Console.WriteLine($"应用版本: {appVer}"); Console.WriteLine($".NET运行时版本: {runtimeVer}"); Console.WriteLine("已启用插件版本:"); foreach (var plugin in pluginVersions) { Console.WriteLine($" - {plugin.Key}: {plugin.Value}"); } Environment.Exit(0); } }, customVersionOpt); // 构建并启动命令行处理 await new CommandLineBuilder(rootCommand) .UseDefaults() .Build() .InvokeAsync(args);
方法二:直接重写默认选项的处理程序
不需要移除默认选项,直接找到它并替换处理逻辑,更简洁:
using System.CommandLine; using System.CommandLine.Builder; using System.CommandLine.Parsing; using System.Reflection; var rootCommand = new RootCommand("你的应用功能描述"); // 找到默认的--version选项 var defaultVersionOpt = rootCommand.Options.FirstOrDefault(o => o.Name == "version") as Option<bool>; if (defaultVersionOpt != null) { // 替换默认的处理逻辑 defaultVersionOpt.SetHandler(() => { var appVer = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "未知版本"; var runtimeVer = Environment.Version.ToString(); var pluginVersions = new Dictionary<string, string> { ["支付插件"] = "2.1.0", ["日志插件"] = "1.5.3" }; Console.WriteLine("=== 详细版本信息 ==="); Console.WriteLine($"应用版本: {appVer}"); Console.WriteLine($".NET运行时版本: {runtimeVer}"); Console.WriteLine("插件版本列表:"); foreach (var plugin in pluginVersions) { Console.WriteLine($" * {plugin.Key}: {plugin.Value}"); } Environment.Exit(0); }); } // 构建并启动命令行处理 await new CommandLineBuilder(rootCommand) .UseDefaults() .Build() .InvokeAsync(args);
注意事项
- 插件版本的获取逻辑需要根据你的项目实际情况调整,比如从配置文件、插件程序集里读取
- 两种方法都能达到目的,方法二更适合只改输出内容的场景,方法一适合需要修改选项描述、添加别名(比如
-v)的情况
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

