程序员的世界,命令行工具一直是“体验非常友好”的工具,也能自动化完成很多事情,同时还能结合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. 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options

    命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...

  2. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

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

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

  4. 快速开发一个PHP扩展

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

  5. 基于django快速开发一个网站(一)

    基于django快速开发一个网站(一) *  创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...

  6. 使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件

    导语 最近看到不少使用vue制作的音乐播放器,挺好玩的,本来工作中也经常使用Vue,一起交流学习,好的话点个star哦 本项目特点如下 : 1. 原生js封装自己的跨域请求函数,支持promise调用 ...

  7. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  8. HTTPie:一个不错的 HTTP 命令行客户端

    转自:http://top.jobbole.com/9682/ HTTPie:一个不错的 HTTP 命令行客户端 HTTPie (读aych-tee-tee-pie)是一个 HTTP 的命令行客户端. ...

  9. curl太复杂难用记不住?来试试Httpie一个简单的现代化命令行Http客户端

    HTTPie 是一个简单的现代化命令行 HTTP 客户端. 交互友好,JSON支持,语法高亮,类wget下载,支持拓展等 功能特性 自然而且简单的命令语句 格式化且高亮显示输出内容 内置 JSON 支 ...

随机推荐

  1. lower_bound()返回值

    lower_bound()函数实现功能就是二分查找,函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置.如果所有元素都小于val,则 ...

  2. 通讯服务类API调用的代码示例合集:短信服务、手机号归属地查询、电信基站查询等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 短信服务:通知类和验证码短信,全国三网合一通道,5秒内到达,费用低 ...

  3. elasticsearch-5.1.1使用snapshot接口备份索引

    如果ES是集群,那么需要使用共享存储,支持的存储有:a.shared file systemb.S3c.HDFS 我使用的是第一种,NFS共享文件系统.这里要说一下权限问题,ES一般是使用 elast ...

  4. java 集合类Array、List、Map区别和优缺点

    Java集合类主要分为以下三类: 第一类:Array.Arrays 第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Array ...

  5. win10安装mongodb及配置 和 mongodb的基本使用(node环境)

    mongodb安装 下载地址: https://www.mongodb.com/download-center 下载后,我们点击mongodb-win32-x86_64-2008plus-ssl-3. ...

  6. SQL总结手册

    1.SQL语法 (1)查询 SQL查询是使用最多的,需要凭借结构.索引和字段类型等因素.大多数据库含有一个优化器(optimizer),把用户查询转换为可选形式,以提高查询效率. 基本语法为: SEL ...

  7. 追溯 React Hot Loader 的实现

    文:萝卜(沪江金融前端开发工程师) 本文原创,转载请注明作者及出处 如果你使用 React ,你可以在各个工程里面看到 Dan Abramov 的身影.他于 2015 年加入 facebook,是 R ...

  8. burpsuite + sqlmap 日志导出批量扫描

    http://lcx.cc/?i=4207   在burpsuite中options -->misc-->logging中选择要记录的日志来源: 一般是proxy request: 生成的 ...

  9. Innotop简单介绍

      Innotop介绍 Innotop是一款Perl脚本编写.开源.功能强大的MySQ的监控工具,它通过文本模式(命令行模式)监控,功能强大,配置简单,易于使用等等特性.Innotop这个项目位于ht ...

  10. 关系网络理论︱细讲中介中心性(Betweeness Centrality)

    关系网络在我认为都是一种很简单暴力地能挖掘人群特征关系的一种方式,特别今天去听了一场关于AI与金融领域的结合,里面提到了拓扑分析其实就是关系网络的解释.我在之前的文章( R语言︱SNA-社会关系网络- ...