CommandLine是一個.NET庫,用于創建命令行應用程序。它提供了一種簡單的方法來解析命令行參數,并且可以幫助您構建一個功能強大的命令行界面。在本文中,我們將介紹如何使用CommandLine庫創建.NET命令行應用程序。
1. 背景
在.NET開發中,我們經常需要創建命令行應用程序。比如一些工具類應用程序,或者一些自動化腳本等。為了方便用戶使用這些應用程序,我們通常會提供一個命令行界面,用戶可以通過命令行參數來指定應用程序的行為。
然而,處理命令行參數并不是一件容易的事情。通常情況下,我們需要編寫大量的代碼來解析命令行參數,并且處理各種不同的情況。這不僅會增加我們的工作量,還會增加應用程序的復雜性。
為了簡化這個過程,我們可以使用CommandLine庫。這是一個.NET庫,專門用于創建命令行應用程序。它提供了一種簡單的方法來解析命令行參數,并且可以幫助我們構建一個功能強大的命令行界面。
在之前的《用.NET做DDNS動態域名解析和SSL證書申請》文章中,我們在介紹SangServerTool工具時就已經介紹了 CommandLineParser 這個命令行解析庫,雖然其使用上非常友好,但是因為這個庫積壓了很多issue,并且已經很久沒有維護了,同時對裁剪的支持也不夠好。所以,我們這里介紹一個新的庫 CommandLine。
2. CommandLine 介紹
System.CommandLine
是一個由官方維護的為 .NET 應用程序設計的庫,專注于簡化命令行界面的創建和管理。它旨在幫助開發者構建那些需要解析命令行參數、選項和命令的應用程序,同時提供豐富的功能來支持幫助文本的生成、參數綁定、依賴注入等。
核心功能
- 命令行參數解析:自動解析用戶從命令行輸入的參數、選項和命令,減少手動解析的需要。
- 生成幫助文本:自動生成幫助文本,為用戶提供關于如何使用命令行應用的指導。
- 參數綁定:將命令行輸入綁定到應用程序的數據模型或處理邏輯,簡化參數處理。
- 支持自動補全:支持 Tab 鍵自動補全功能,提高用戶使用命令行應用的效率。
- 響應文件支持:允許用戶通過文件輸入命令行參數,適用于參數較多的情況。
開發者好處
- 減少樣板代碼:開發者可以專注于業務邏輯,而不是處理命令行解析的細節。
- 易于測試:應用邏輯可以獨立于命令行輸入分析代碼進行測試。
- 性能優化:庫設計考慮到了性能和資源使用,適合開發快速、輕量級的命令行應用。
用戶好處
- 一致性:遵循 POSIX 或 Windows 約定,確保命令行輸入的一致性解析。
- 易用:自動生成的幫助文本和支持的自動補全功能提高了用戶體驗。
3. 安裝CommandLine庫
System.CommandLine
庫是一個 NuGet 包,可以通過 NuGet 包管理器或者 .NET CLI 來安裝。在 Visual Studio 中,可以通過 NuGet 包管理器來搜索并安裝 System.CommandLine
包。
dotnet add package System.CommandLine --prerelease
需要注意的是,目前 System.CommandLine
庫還處于預覽版階段,所以需要添加 --prerelease
參數來安裝預覽版的包。
4. 命令定義的使用
這里我們以 SangServerTool
工具為例,來演示如何使用 System.CommandLine
庫來定義命令行參數。SangServerTool
含有三個子命令:ddns
、ssl
和 sync
,分別對應 DDNS 動態域名解析、SSL 證書申請和遠端證書同步功能。
首先,我們需要定義一個 RootCommand
對象,用于表示根命令。
using System.CommandLine;
using System.CommandLine.NamingConventionBinder;// 創建根命令
var rootCommand = new RootCommand("SangServerTool");
然后,我們可以通過 Command
對象來定義子命令和選項。例如,我們可以定義一個 ddns
子命令,并為其添加選項。
// 定義ddns命令
var ddnsCommand = new Command("ddns", "Set DDNS.");
ddnsCommand.AddOption(new Option<string>(new[] { "--config", "-c" }, "Set config json file.") { IsRequired = true});
ddnsCommand.AddOption(new Option<int>("--delay", () => 0, "How many seconds delay?"));
ddnsCommand.AddOption(new Option<bool>("--del", () => false, "Is delete DDNS?"));
ddnsCommand.AddOption(new Option<bool>("--v6", () => false, "Is ipv6?"));
接著,我們需要定義一個處理命令的委托,并將其與命令綁定。
// 定義處理命令的委托
ddnsCommand.Handler = CommandHandler.Create<string, int, bool, bool>((config, delay, del, v6) =>
{// 處理ddns命令Console.WriteLine($"config: {config}");Console.WriteLine($"delay: {delay}");Console.WriteLine($"del: {del}");Console.WriteLine($"v6: {v6}");
});
最后,我們將子命令添加到根命令中,并執行命令行解析。
// 將ddns命令添加到根命令
rootCommand.AddCommand(ddnsCommand);
// 解析并執行命令
return await rootCommand.InvokeAsync(args);
最后
關于 System.CommandLine
庫的使用,我們在這里只是做了一個簡單的介紹,更多的功能和用法可以參考官方文檔。
雖然 System.CommandLine 提供了豐富的功能,但它仍然處于預覽版階段,這意味著在正式發布之前,它可能會發生重大更改。因此,開發者在使用時需要注意版本更新和兼容性問題。不過,考慮到它是由官方維護的庫,未來應該會得到更好的支持和維護。