程序員的世界,命令行工具一直是“體驗非常友好”的工具,也能自動化完成很多事情,同時還能結合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版。