程序员的世界,命令行工具一直是“体验非常友好”的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本)。在.NET Core中,命令行应用程序是基础,但是如何实现像 “cat” 这种功能呢?今天就为大家介绍一个packages来优雅的实现一个命令行应用程序。

一般命令行程序包含什么?

  1. 使用方式
  2. 帮助信息
  3. 子命令
  4. 参数
  5. 选项

帮助信息

帮助信息如上,介绍了命令的作用和参数、选项作用。

这个是必不可少的。

子命令

一个应用程序打包了多个功能,这时候就可以使用子命令,比如 dotnet ef migrations,这时候 migrations 就是子命令,可以看做本来可以拆分成多个可执行程序的东西,用一个可执行程序来打包完成,子命令可以再次具有自己的帮助、参数和选项。

参数

参数在形式上有点类似子命令,比如 cat hello.txt 这边的hello.txt就是一个参数,参数一般是命令中必须存在的内容。比如 cat 命令,没有输入路径则没法执行任何任务。

选项

选项是指可选项,用来扩展命令。比如删除时是否需要输出被删除的文件?是否删除文件夹?是否递归删除?等等。

如何用.NET Core快速开发一个命令行程序?

CommandLineUtils Packages

今天的主角,这边包主要就是用来做命令行程序的。

说起这个包的历史,还是比较曲折的。

这个包原是aspnet团队提供的,开源项目在

https://github.com/aspnet/Common

但是大家可以发现在现在的仓库的src中已经没有了 CommandLineUtils 这个项目。

翻看历史我们可以发现 Microsoft.Extensions.CommandLineUtils 这个项目

https://github.com/aspnet/Common/tree/rel/1.1.1/src/Microsoft.Extensions.CommandLineUtils

同时nuget上还是有这个packages的。

https://www.nuget.org/packages/Microsoft.Extensions.CommandLineUtils/

由于这个项目是满足内需的(ef migrations,等命令)所以MS并不打算长期发展这个项目。所以MS推荐社区来维护一个类似的项目。

那么就有很多热心的人开始接力的

https://github.com/natemcmaster/CommandLineUtils(MS官方链接)

这个库在基础功能上还增加了

  1. Attribute API(用Attribute来简化编写)
  2. ArgumentEscaper(参数转义)
  3. Prompt(获得输入相关的帮助,用户输入 yes or no,获取一串输入密码)
  4. DotNetExe(得到dotnet.exe的路径)

实现一个简单的cat命令

好了我们介绍了一般命令行程序的构成,下面我们来用.NETCore来实现一个简化版的cat命令。

new CommandLineApplication

Name:命令名称

Description:命令描述

app.HelpOption("-h|--help")

设置含有帮助选项,触发方式为 –h 或者 —help,这边用 | 分隔。

app.Argument("path", "file")

设置一个参数,参数名为 path,描述为file。还可以设置参数是否允许多个等。

app.Option

设置了两个选项,选项的触发方式与HelpOption一致,后面一个参数是说明。还可以配置这个参数是否有值(是否只是开关),是否只有一个值,是否允许多个值等。

app.OnExecute

命令的具体执行逻辑。

app.Execute

与主程序对接,真正的执行者。

逻辑1,参数验证与转换

逻辑2,具体的输出

发布、测试

使用自宿主的方式发布一个win-x64的应用。

具体的发布方式可以看官网文档

https://docs.microsoft.com/zh-cn/dotnet/core/deploying/

写在最后

我们来瞅一瞅发布后的文件夹

是不是太夸张,其实这种简单的程序,我们可以这样子

这个我们就留着后面介绍吧,有兴趣的可以先去了解下“CoreRT”

https://github.com/dotnet/corert

.NET Core的AOT项目,目前还是alpha版。

使用.NET Core快速开发一个较正规的命令行应用程序相关推荐

  1. LFTP : 一个功能强大的命令行FTP程序

    LFTP : 一个功能强大的命令行FTP程序 大家好,这篇文章是介绍Lftp以及如何在Linux操作系统下安装的.Lftp是一个基于命令行的文件传输软件(也被称为FTP客户端),由Alexander ...

  2. 快速开发一个PHP扩展

    快速开发一个PHP扩展 作者:heiyeluren 时间:2008-12-5 博客:http://blog.csdn.net/heiyeshuwu 本文通过非常快速的方式讲解了如何制作一个PHP 5. ...

  3. 有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务

    更多云原生技术资讯可关注阿里巴巴云原生技术圈. Puppeteer 是什么? puppeteer 官网的介绍如下: Puppeteer is a Node library which provides ...

  4. 如何快速开发一个 Dubbo 应用?(含沙龙报名)

    阿里妹导读:在分布式系统中,远程调用是最基础也是最重要的基石.历史上,曾经先后出现过 CORBA.RMI.EJB.WebService 等技术和规范,在服务化以及微服务日趋流行的今天,更多的被广泛使用 ...

  5. 如何快速开发一个 Dubbo 应用

    转载自   如何快速开发一个 Dubbo 应用 导读:在分布式系统中,远程调用是最基础也是最重要的基石.历史上,曾经先后出现过 CORBA.RMI.EJB.WebService 等技术和规范,在服务化 ...

  6. Serverless 实战 —— 前端也可以快速开发一个 Puppeteer 网页截图服务

    Serverless 实战 -- 前端也可以快速开发一个 Puppeteer 网页截图服务 更多云原生技术资讯可关注阿里巴巴云原生技术圈. Puppeteer 是什么? puppeteer 官网的介绍 ...

  7. 如何快速开发一个支持高效、高并发的分布式ID生成器(一)

    ID生成器是指能产生不重复ID服务的程序,在后台开发过程中,尤其是分布式服务.微服务程序开发过程中,经常会用到,例如,为用户的每个请求产生一个唯一ID.为每个消息产生一个ID等等,ID生成器也是进行无 ...

  8. 用python快速开发一个实用的socket服务器

    用python快速开发一个实用的socket服务器 - 吴尔平 - 博客园 用python快速开发一个实用的socket服务器 首先,要明白不是所有的socket服务都需要高性能.如果要求高性能,使用 ...

  9. .Net Core快速开发平台源码 敏捷开发框架OA系统 CRM快速开发框架

    .Net Core快速开发平台源码 3.4.1版本 敏捷开发框架OA系统 CRM快速开发框架 NET版本:.NET5 VUE版本:3.3.2 前后端分离,纯源码,无封装,无加密 当时公司要建自己的内部 ...

最新文章

  1. MXNet 安装 Windows
  2. 化整为零,一步一步教你搭建Prometheus监控报警系统
  3. 解码base64_linux C++ Base64编解码
  4. 外设驱动库开发笔记2:AD8400系列数字电位器驱动
  5. mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?
  6. android104 帧动画,补间动画,属性动画
  7. Ⅴ0还有别的方法设置图案吗_定制汽车硅胶按键你知道厂家是怎么给汽车按键镭雕的吗...
  8. ConfigMap用管理对象的方式管理配置
  9. 迁移Exchange Server 2003
  10. solidity之以太币支付
  11. Flutter进阶—实现动画效果(二)
  12. 在cmd下安装Scrapy怎么解决方案python3
  13. Win11鼠标动不了 键盘怎么代替鼠标操作
  14. 模2除法(CRC校验码计算)模2除法和算数除法不同,文中例子120/13用模2除法结果:商11余数7,而算数除法结果:商9余数3
  15. 儿童专注力训练——虚线描成实现
  16. 详解opencv的HOG描述子维度数目的计算原理
  17. arm低功耗模式种类
  18. The X New Developer’s Guide——第一章 基本概念
  19. 卡耐基梅隆大学计算机工程录取率,卡内基梅隆大学2020新生数据,计算机学院录取率堪比藤校!...
  20. 淘宝提高主图点击率怎么做?大神导航,一个神奇的网站,从此开启大神之路!

热门文章

  1. 并发编程-03线程安全性之原子性(Atomic包)及原理分析
  2. Android零碎知识点-更新中
  3. 腾讯面试题 Prometheus-PQL
  4. 深入理解yield from语法
  5. 微信小程序(购物车)--在wxml中设置保留小数位数
  6. python中重要的模块asyncio
  7. webstorm小技巧
  8. Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
  9. [Google Guava] 6-字符串处理:分割,连接,填充
  10. InnoDB 存储引擎体系架构