本文转载自微信公众号《老王加》,老王加作者老王。转载本文请联系老王Plus公众号。前言控制台应用Console在我们的开发中非常有用。从一个简单的功能测试,或者一套不需要复杂UI的工具应用,到大型的后端服务,都会用到Console。在这里,命令行应用程序Cli是另一种非常典型的应用程序类型。命令行应用通常在概念上需要我们输入一定的参数,根据不同的参数选择不同的程序流程或方法来执行。一个简单的例子:%python3Python3.9.0(default,Nov132020,12:12:14)[Clang12.0.0(clang-1200.0.32.21)]ondarwinType"help","copyright","credits"or"license"formoreinformation.>>>importOSTraceback(mostrecentcallast):File"",line1,inModuleNotFoundError:Nomodulenamed'OS'>>>importos>>>print("HelloWangPlus")HelloWangPlus>>>exit()不需要它不需要不管python3是什么。我们可以看到,在进入命令行的时候,一般都会先有一个简单的功能介绍,然后是一个提示符,这里是>>>。然后您可以输入命令和参数。如果输入正确,会有错误提示。如果输入正确,就会有相应的输出。通常,如果我们想要实现这样的效果,我们需要一个大循环来对输入的命令和参数进行解析和响应,然后进行相应的处理。其实在做这样一个应用的时候,会有很大的精力去处理这个循环。如果您不相信我,请尝试自己编写。今天给大家介绍的是一个库,Nuget上的库,是最近无意中发现的,但是给了我很大的惊喜。其实我自己在写应用的时候,如果可能的话,我会优先考虑用Console或者Cli的方式来写,轻量快速,不需要处理太多的UI工作。这个库叫做CommandLineTool。言归正传,我从头介绍一下这个库的使用。创建一个项目让我们先创建一个项目。老习惯,使用命令行创建:%dotnetnewconsole-odemo-fnet5.0这里需要注意一下,这个库目前支持DotnetCore5.0,所以我们就用5.0。然后,引入CommandLineTool:%dotnetaddpackageCommandLineTool就这样,项目就完成了。这个库最简单的部分是它实现起来非常简单。第一步是先创建一个类。这个类就是我们要实现Cli命令行功能的类TestCLI:[App("Demo")]publicclassTestCLI{}这个类是空的,我们忽略它。第二步,在Program.cs中添加这个类cli.SetCancellationKeys(new(){"exit"});cli.Start();}}看一个补充的内容:Introduction——这个Cli的描述,提醒你这个程序的功能,随便写;PromptText——这是一个提醒字符的内容,类似于上面例子中的>>>;下面这句cli.SetCancellationKeys(new(){"exit"});定义退出命令。也就是说,在提示后键入exit将退出应用程序。运行此应用程序:%dotnetdemo.dll这是一个演示应用程序WangPlus>?'?'不匹配。你是说'-h'吗?无法识别的命令参数'?'demoDemoUsage:demo[options]Options:--versionShowversioninformation-?,-h,--helpShowhelpandusageinformationWangPlus>exitTerminatingconsole...哇,一个简单的Cli架子搭建好了。第三步,开始写命令处理。命令处理放在TestCLI.cs中。[App("Demo")]publicclassTestCLI{[Command("hello","Justsayhello")]publicstaticvoidHello([ParamArgument()]stringname){Console.WriteLine($"Hello{name}");}}method还是我们很熟悉的常用方法,并没有什么特别之处。再次运行:WangPlus>helloRequiredargumentmissingforcommand:hellohello就是说helloUsage:demo[options]helloArguments:Options:-?,-h,--helpShowhelpandusageinformationWangPlus>hellowangHellowang出来有效。让我们关注代码的几个部分:属性命令,它包含两个参数。第一个参数是我们要执行的命令,第二个参数是命令的描述。方法中[ParamArgument()]表示后面的参数来自输入命令的参数。有以下几种形式://多参数[Command("multiinput","多参数")]publicstaticvoidMultiInput([ParamArgument()]Listnames){}//多文件[Command("multifile","多个文件")]publicstaticvoidMultiFile([ParamArgument()]Listfiles){}//额外参数[Command("withpara","extraparameters")]publicstaticvoidWithPara([ParamArgument()]stringnames,[ParamOption("-a")]stringop1){}关注附加参数的方式。有的时候,我们可能需要用下面的方法来处理命令:%demo-aa-value-bb-valuecommand这个方法就是为了解决这样的问题。是否有Gettocool点?本文有一个支持代码,在https://github.com/humornif/Demo-Code/tree/master/0053/demo