使用.NET Core快速开发一个较正规的命令行应用程序
程序员的世界,命令行工具一直是“体验非常友好”的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本)。在.NET Core中,命令行应用程序是基础,但是如何实现像 “cat” 这种功能呢?今天就为大家介绍一个packages来优雅的实现一个命令行应用程序。
一般命令行程序包含什么?
- 使用方式
- 帮助信息
- 子命令
- 参数
- 选项
帮助信息

帮助信息如上,介绍了命令的作用和参数、选项作用。
这个是必不可少的。
子命令
一个应用程序打包了多个功能,这时候就可以使用子命令,比如 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官方链接)
这个库在基础功能上还增加了
- Attribute API(用Attribute来简化编写)
- ArgumentEscaper(参数转义)
- Prompt(获得输入相关的帮助,用户输入 yes or no,获取一串输入密码)
- 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快速开发一个较正规的命令行应用程序的更多相关文章
- 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options
命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- 如何快速开发一个支持高效、高并发的分布式ID生成器
ID生成器是指能产生不重复ID服务的程序,在后台开发过程中,尤其是分布式服务.微服务程序开发过程中,经常会用到,例如,为用户的每个请求产生一个唯一ID.为每个消息产生一个ID等等,ID生成器也是进行无 ...
- 快速开发一个PHP扩展
快速开发一个PHP扩展 作者:heiyeluren时间:2008-12-5博客:http://blog.csdn.net/heiyeshuwu 本文通过非常快速的方式讲解了如何制作一个PHP 5.2 ...
- 基于django快速开发一个网站(一)
基于django快速开发一个网站(一) * 创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...
- 使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件
导语 最近看到不少使用vue制作的音乐播放器,挺好玩的,本来工作中也经常使用Vue,一起交流学习,好的话点个star哦 本项目特点如下 : 1. 原生js封装自己的跨域请求函数,支持promise调用 ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
- HTTPie:一个不错的 HTTP 命令行客户端
转自:http://top.jobbole.com/9682/ HTTPie:一个不错的 HTTP 命令行客户端 HTTPie (读aych-tee-tee-pie)是一个 HTTP 的命令行客户端. ...
- curl太复杂难用记不住?来试试Httpie一个简单的现代化命令行Http客户端
HTTPie 是一个简单的现代化命令行 HTTP 客户端. 交互友好,JSON支持,语法高亮,类wget下载,支持拓展等 功能特性 自然而且简单的命令语句 格式化且高亮显示输出内容 内置 JSON 支 ...
随机推荐
- uva 116 单向TSP
这题的状态很明显. 转移方程就是 d(i,j)=min(d(i+1,j+1),d(i,j+1),d(i-1,j+1)) //注意边界 我用了一个next数组方便打印结果,但是一直编译错误,原来是不能用 ...
- POJ - 2698 贪心
经典面替换算法,每次选择最远的那个碟片请求进行替换. AC代码 #include <cstdio> #include <cmath> #include <algorith ...
- nyoj888 取石子(九) 反Nimm博弈
这题就是反Nimm博弈--分析见反Nimm博弈 AC代码 #include <cstdio> #include <cmath> #include <algorithm&g ...
- 最简化搭建yum仓库
在使用rpm安装软件包时,时常会遇到一些软件依赖性问题,如果是简单的一两个依赖性还是可以手动解决.要是出现大量的依赖性问题的话会让增大工作量.yum是一个很好的前端程序,可解决软件包相关依赖性,可在多 ...
- dojo中的xhrPost请求(JSON)
dojo中的xhrPost请求 dojo.xhrPost({ url:"../area.action", content:{ areaCode:areaCode }, handle ...
- 利用squid 反向代理提高网站性能
部分转自:http://www.ibm.com/developerworks/cn/linux/l-cn-squid/ Squid 反向代理的实现原理 目前有许多反向代理软件,比较有名的有 Nginx ...
- CSS3之background-clip
1.属性简介 background-clip:padding|border|content|text|!important 2.兼容性 (1)IE6.7.8不兼容 (2)火狐3.0以上兼容 (3)Ch ...
- IBM Rational AppScan:跨站点脚本攻击深入解析
IBM Rational AppScan:跨站点脚本攻击深入解析 了解黑客如何启动跨站点脚本攻击(cross-site scripting,XSS),该攻击危害(及不危害)什么,如何检测它们,以 ...
- 错误代码: 1242 Subquery returns more than 1 row
1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT t.id, DATE_FORMAT( t.statisTim ...
- Flash Builder4.0新建Flex应用程序切换主题出错
1.错误描述 2.错误原因 <?xml version="1.0" encoding="utf-8"?> <s:Application xml ...