Dotnet Core 优雅的命令行实现

开发 前端
控制台应用 Console,在我们开发中用处很多。小到一个简单的功能测试,或一组不需要复杂 UI 的工具类应用,大到后端的服务,都会用到 Console。

[[409683]]

本文转载自微信公众号「老王Plus」,作者老王Plus的老王。转载本文请联系老王Plus公众号。

前言

控制台应用 Console,在我们开发中用处很多。小到一个简单的功能测试,或一组不需要复杂 UI 的工具类应用,大到后端的服务,都会用到 Console。

在这里面,命令行应用 Cli,又是非常典型的一个应用类型。

命令行应用,通常概念上需要我们输入一定参数,根据参数的不同,选择不同的程序流程或方法来执行。

举个简单的例子:

  1. % python3 
  2. Python 3.9.0 (default, Nov 13 2020, 12:12:14)  
  3. [Clang 12.0.0 (clang-1200.0.32.21)] on darwin 
  4. Type "help""copyright""credits" or "license" for more information. 
  5. >>> import OS 
  6. Traceback (most recent call last): 
  7.   File "<stdin>", line 1, in <module> 
  8. ModuleNotFoundError: No module named 'OS' 
  9. >>> import os 
  10. >>> print("Hello WangPlus"
  11. Hello WangPlus 
  12. >>> exit() 

不需要管 python3 是什么,这不重要。

我们能看到,当进入一个命令行时,一般首先会有简单的功能介绍,然后是一个提示符,在这里是 >>>。然后可以输入命令和参数,如果输入正确,会有错误提示。如果输入正确,会有适当的输出。

通常,如果想实现这样的效果,我们需要一个大的循环,来解析和响应输入的命令和参数,然后进行对应的处理。

事实上,在做这样一个应用时,会有很大的精力来处理这个循环。不相信的话,可以自己试着写一写。

今天给大家介绍的,是一个库,Nuget 上的库,也是我最近无意中发现的,但给了我很大的惊喜。事实上,我自己在写应用时,如果有可能,我会优先采用 Console 或 Cli 的方式来写,轻量、快速,不用处理太多 UI 方面的工作。

这个库叫 CommandLineTool。

下面进入正题,我从头介绍一下这个库的使用。

创建项目

先来创建项目。老习惯,用命令行创建:

  1. % dotnet new console -o demo -f net5.0 

这儿需要注意一下,这个库目前支持到 Dotnet Core 5.0,所以我们就用 5.0 了。

然后,引入 CommandLineTool:

  1. % dotnet add package CommandLineTool 

就这样,工程就算是建完了。

实现功能

这个库最简单的地方,是实现起来非常简单。

第一步,先建一个类

这个类,就是我们要实现 Cli 命令行功能的类 TestCLI:

  1. [App("Demo")] 
  2. public class TestCLI 

类是空的,先不管它。

第二步,在 Program.cs 里加入这个类

  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         Cli cli = new Cli(typeof(TestCLI)) 
  5.         { 
  6.             Introduction = "这是一个 Demo 应用"
  7.             PromptText = "WangPlus"
  8.         }; 
  9.  
  10.         cli.SetCancellationKeys(new() { "exit" }); 
  11.         cli.Start(); 
  12.     } 

看一个加入的内容:

Introduction - 这个 Cli 的说明,提示一下这个程序的功能,随便写;

PromptText - 这个是提示符的内容,类似于最上面例子的 >>>;

下面这一句cli.SetCancellationKeys(new() { "exit" });,是定义了退出的命令。也就是说,在提示符后输入 exit,应用就退出了。

跑一下这个应用:

  1. % dotnet demo.dll 
  2. 这是一个 Demo 应用 
  3.  
  4.  
  5. WangPlus > ? 
  6. '?' was not matched. Did you mean '-h'
  7. Unrecognized command or argument '?' 
  8.  
  9. demo 
  10.   Demo 
  11.  
  12. Usage: 
  13.   demo [options] 
  14.  
  15. Options: 
  16.   --version       Show version information 
  17.   -?, -h, --help  Show help and usage information 
  18.  
  19. WangPlus >exit 
  20. Terminating console... 

哇哈哈,一个简单的 Cli 架子搭出来了。

第三步,开始写命令处理

命令处理放在 TestCLI.cs 中。

  1. [App("Demo")] 
  2. public class TestCLI 
  3.     [Command("hello""就是打个招呼")] 
  4.     public static void Hello([ParamArgument()] string name
  5.     { 
  6.         Console.WriteLine($"Hello {name}"); 
  7.     } 

方法还是我们非常熟悉的一个普通方法,并没有什么特别的。

再跑一下:

  1. WangPlus >hello 
  2. Required argument missing for command: hello 
  3.  
  4. hello 
  5.   就是打个招呼 
  6.  
  7. Usage: 
  8.   demo [options] hello <name
  9.  
  10. Arguments: 
  11.   <name
  12.  
  13. Options: 
  14.   -?, -h, --help  Show help and usage information 
  15.  
  16. WangPlus >hello wang   
  17. Hello wang 

出来效果了。

重点看一下代码里的几个部分:

属性 Command,里面两个参数,第一个参数就是我们要实现的命令,第二个参数是命令的说明。

方法里,[ParamArgument()] 表示后面跟的参数来自于输入的命令的参数。

下面还有几种形式:

  1. //多个参数 
  2. [Command("multiinput""多个参数")] 
  3. public static void MultiInput([ParamArgument()] List<string> names) {} 
  4.  
  5. //多个文件 
  6. [Command("multifile""多个文件")] 
  7. public static void MultiFile([ParamArgument()] List<FileInfo> files) {} 
  8.  
  9. //额外的参数 
  10. [Command("withpara""额外参数")] 
  11. public static void WithPara([ParamArgument()] string names, [ParamOption("-a")] string op1) {} 

重点说一下额外参数的方式。

有时候,我们可能需要下面的方式来处理命令:

  1. % demo -a a-value -b b-value command 

这个方式,就是来解决这样的问题的。

有没有 Get 到爽点?

 

本文有配套代码,在 https://github.com/humornif/Demo-Code/tree/master/0053/demo

 

责任编辑:武晓燕 来源: 老王Plus
相关推荐

2017-08-30 19:11:38

Linux命令行tab

2020-12-11 06:44:16

命令行工具开发

2020-12-10 16:16:08

工具代码开发

2010-11-16 11:50:21

oracle命令行登录

2022-04-01 12:51:44

命令Containerd

2015-07-01 09:15:46

linuxQuora命令行

2010-11-24 14:51:55

Mysql命令行

2010-11-16 11:55:31

Oracle命令行

2011-01-18 19:11:26

Postfix命令行

2009-12-08 14:31:31

PHP命令行读取参数

2009-07-20 09:55:30

华为命令行解析华为认证

2010-07-15 09:37:47

Perl命令行

2010-09-01 14:23:54

Linux命令行开发

2019-07-23 13:45:38

LinuxFedora权限

2010-08-20 10:05:23

用户命令

2010-11-24 15:33:59

mysql命令行参数

2012-02-08 16:37:36

ibmdw

2010-07-20 14:18:22

Perl命令行

2010-03-10 17:23:37

Python 命令行参

2009-12-24 14:51:39

Linux命令行
点赞
收藏

51CTO技术栈公众号