.net core/.net 使用 CommandLineParser 來標準化地解析命令行

CommandLineParser 是一款用於解析命令行參數的 NuGet 包。你只須要關注你的業務,而命令行解析只須要極少許的配置代碼。html

本文將介紹如何使用 CommandLineParser 高效寫出本身程序的命令行解析部分。git

NuGet 包和 GitHub 開源倉庫


NuGet 包: CommandLineParser
GitHub 開源倉庫:ide

最簡單的命令行解析


 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 實例。post

這時,在命令行中就可使用命令了:ui

dotnet demo.dll -f C:\Users\lvyi\Desktop\Test.txt

因爲咱們標記 Files 是必要屬性,因此若是此參數沒有指定,將返回命令行的使用說明。此使用說明中就包含了咱們在 Option 參數中編寫的 HelpText spa

包含多個方法的命令行解析


若是一個命令行程序只作一件事情,那麼以上代碼足以應付大多數的狀況。但是有時候一個命令行程序是爲了作一類事情的 —— 典型的例子就是 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;
        }
    }
}

對於這一段程序,咱們可使用兩種不一樣的謂詞來執行命令:code

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 標記的類別均可以有本身獨立的一套命令行參數。htm

Option 是命名的命令行參數。在命令行中,你必須指定命令行縮寫或者全稱來指定命令行參數的不一樣類型。blog

Value 是命令行的無名參數,它是靠在命令行謂詞後面的參數位置來肯定解析到哪個屬性上的。

 

原文連接: https://walterlv.com/post/introduce-command-line-parser.html

相關文章
相關標籤/搜索