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


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

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

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

幫助信息

image

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

這個是必不可少的。

子命令

一個應用程序打包了多個功能,這時候就可以使用子命令,比如 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命令。

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版。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM