使用.NET Core快速開發一個較正規的命令行應用程序

程序員的世界,命令行工具一直是「體驗很是友好」的工具,也能自動化完成不少事情,同時還能結合shell來進行某項任務的批處理(腳本)。在.NET Core中,命令行應用程序是基礎,可是如何實現像 「cat」 這種功能呢?今天就爲你們介紹一個packages來優雅的實現一個命令行應用程序。git

通常命令行程序包含什麼?

  1. 使用方式
  2. 幫助信息
  3. 子命令
  4. 參數
  5. 選項

幫助信息

image

幫助信息如上,介紹了命令的做用和參數、選項做用。程序員

這個是必不可少的。github

子命令

一個應用程序打包了多個功能,這時候就可使用子命令,好比 dotnet ef migrations,這時候 migrations 就是子命令,能夠看作原本能夠拆分紅多個可執行程序的東西,用一個可執行程序來打包完成,子命令能夠再次具備本身的幫助、參數和選項。shell

參數

參數在形式上有點相似子命令,好比 cat hello.txt 這邊的hello.txt就是一個參數,參數通常是命令中必須存在的內容。好比 cat 命令,沒有輸入路徑則無法執行任何任務。app

選項

選項是指可選項,用來擴展命令。好比刪除時是否須要輸出被刪除的文件?是否刪除文件夾?是否遞歸刪除?等等。工具

如何用.NET Core快速開發一個命令行程序?

CommandLineUtils Packages

今天的主角,這邊包主要就是用來作命令行程序的。測試

提及這個包的歷史,仍是比較曲折的。命令行

這個包原是aspnet團隊提供的,開源項目在blog

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命令。

image

new CommandLineApplication

Name:命令名稱

Description:命令描述

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

設置含有幫助選項,觸發方式爲 –h 或者 —help,這邊用 | 分隔。

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

設置一個參數,參數名爲 path,描述爲file。還能夠設置參數是否容許多個等。

app.Option

設置了兩個選項,選項的觸發方式與HelpOption一致,後面一個參數是說明。還能夠配置這個參數是否有值(是否只是開關),是否只有一個值,是否容許多個值等。

app.OnExecute

命令的具體執行邏輯。

app.Execute

與主程序對接,真正的執行者。

邏輯1,參數驗證與轉換

image

邏輯2,具體的輸出

image

發佈、測試

使用自宿主的方式發佈一個win-x64的應用。

具體的發佈方式能夠看官網文檔

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

image

image

寫在最後

咱們來瞅一瞅發佈後的文件夾

image

是否是太誇張,其實這種簡單的程序,咱們能夠這樣子

image

這個咱們就留着後面介紹吧,有興趣的能夠先去了解下「CoreRT」

https://github.com/dotnet/corert

.NET Core的AOT項目,目前仍是alpha版。

相關文章
相關標籤/搜索