CommandLineParser
是一款用於解析命令列引數的 NuGet 包。你只需要關注你的業務,而命令列解析只需要極少量的配置程式碼。
本文將介紹如何使用 CommandLineParser
高效寫出自己程式的命令列解析部分。
NuGet 包和 GitHub 開源倉庫
NuGet 包: CommandLineParser
GitHub 開源倉庫:
最簡單的命令列解析
1 using System; 2 using System.Collections.Generic; 3 using CommandLine; 4 5 namespace Walterlv.Demo 6 { 7 class Program 8 { 9 public class Options 10 { 11 [Option('f', "file", Required = true, HelpText = "需要處理的檔案。")] 12 public IEnumerable<string> Files { get; set; } 13 14 [Option('o', "override", Required = false, HelpText = "是否覆蓋原有檔案。")] 15 public bool Override { get; set; } 16 } 17 18 static void Main(string[] args) 19 { 20 Parser.Default.ParseArguments<Options>(args).WithParsed(Run); 21 } 22 23 private static void Run(Options option) 24 { 25 // 使用解析後的命令列引數進行操作。 26 foreach (var file in option.Files) 27 { 28 var verb = option.Override ? "覆蓋" : "使用"; 29 Console.WriteLine($"walterlv 正在{verb}檔案 {file}"); 30 } 31 } 32 } 33 }
這個簡單的 Demo 程式使用 Options
類來封裝命令列引數, Parser.Default.ParseArguments
解析到的引數將存入 Options
型別的例項中。而只需要加上 WithParsed
即可在一個新的方法中使用我們解析後的 Options
例項。
這時,在命令列中就可以使用命令了:
dotnet demo.dll -f C:\Users\lvyi\Desktop\Test.txt
由於我們標記 Files
是必要屬性,所以如果此引數沒有指定,將返回命令列的使用說明。此使用說明中就包含了我們在 Option
引數中編寫的 HelpText
。
包含多個方法的命令列解析
如果一個命令列程式只做一件事情,那麼以上程式碼足以應付大多數的情況。可是有時候一個命令列程式是為了做一類事情的 —— 典型的例子就是 git 程式。當你執行 git 的時候,你可以在 git 後面加一個謂詞(動詞),表示執行的是哪一個命令。後面的引數是每個命令都不同的,並且第一個引數是不用指定名稱的。
using System; using System.Collections.Generic; using System.Diagnostics; using CommandLine; namespace Walterlv.Demo { [Verb("check", HelpText = "檢查")] class CheckOptions { [Value(0, HelpText = "一個 .sln 檔案,一個或者多個 .csproj 檔案。")] public IEnumerable<string> InputFiles { get; set; } } [Verb("fix", HelpText = "修復")] class FixOptions { [Value(0, HelpText = "一個 .sln 檔案,一個或者多個 .csproj 檔案。")] public IEnumerable<string> InputFiles { get; set; } [Option('o', "outputFiles", Required = true, HelpText = "修復之後的檔案集合。")] public IEnumerable<string> OutputFiles { get; set; } [Option(Required = false, HelpText = "是否自動決定版本號,這將使用衝突版本號中的最新版本。")] public bool AutoVersion { get; set; } } class Program { static int Main(string[] args) { var exitCode = Parser.Default.ParseArguments<CheckOptions, FixOptions>(args) .MapResult( (CheckOptions o) => CheckSolutionOrProjectFiles(o), (FixOptions o) => FixSolutionOrProjectFiles(o), error => 1); return exitCode; } private static int CheckSolutionOrProjectFiles(CheckOptions options) { return 0; } private static int FixSolutionOrProjectFiles(FixOptions options) { return 0; } } }
對於這一段程式,我們可以使用兩種不同的謂詞來執行命令:
dotnet demo.dll check C:\Users\lvyi\Desktop\Test\Test.csproj
dotnet demo.dll fix C:\Users\lvyi\Desktop\Test\Test.csproj -o C:\Users\lvyi\Desktop\TestFix\Test.csproj
Verb,Option 和 Value
Verb 是在一個命令列選項的 Option 類上標記的,用於指定命令的類別。每一個 Verb 標記的類別都可以有自己獨立的一套命令列引數。
Option 是命名的命令列引數。在命令列中,你必須指定命令列縮寫或者全稱來指定命令列引數的不同型別。
Value 是命令列的無名引數,它是靠在命令列謂詞後面的引數位置來確定解析到哪一個屬性上的。
原文連結: https://walterlv.com/post/introduce-command-line-parser.html