程序员的世界,命令行工具一直是“体验非常友好”的工具,也能自动化完成很多事情,同时还能结合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. 禁掉coolie,session还能正常使用吗?

    Cookie禁用了,Session还能用吗?   Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案 ...

  2. Linux文本的处理

    Linux最最最最重要的哲学思想就是:一切皆文件.文件以及文件的操作在LInux操作系统中是非常的重要.熟练使用精悍小巧快捷的文本处理方式让效率更高. 一.文件查看命令 less 分页查看 [root ...

  3. SetCooperativeLevel函数介绍(设置协作等级)

    函数声明 function SetCooperativeLevel(hWnd: HWND; dwFlags: DWORD): HResult; stdcall; 参数介绍 hWnd        Di ...

  4. Jquery+Json+Handler文件结合应用实例

    1.页面script代码-[model数据.字符串] <script type="text/javascript" charset="utf-8" src ...

  5. input【type="checkbox"】标签与字体对齐

    今天分享一个比较实用的技巧,在实际项目中我们会经常遇到表单的input标签多选和单选的问题,但是往往由于标签自身的样式和我们项目的风格很不搭调,就不能实现了,今天就来告诉大家怎么去实现吧. 第一种:利 ...

  6. TCP粘包、拆包及解决

    TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示 ...

  7. Alice and Bob HDU - 4268

    Alice and Bob's game never ends. Today, they introduce a new game. In this game, both of them have N ...

  8. iOS - Core Animation 核心动画的使用

    1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...

  9. C#接口--C#基础

    1.接口的声明 接口:描述属于任何类或者结构的一组相关功能,是一种规范.功能 组成:属性.方法.事件.索引或者这四种成员的任意组合构成 基本知识点: 1)接口默认的权限修饰符是:public,不允许加 ...

  10. 第三篇:一个Spark推荐系统引擎的实现

    前言 经过2节对MovieLens数据集的学习,想必读者对MovieLens数据集认识的不错了:同时也顺带回顾了些Spark编程技巧,Python数据分析技巧. 本节将是让人兴奋的一节,它将实现一个基 ...