體驗.NET Core 命令行應用程式-CommandLineUtils

  • 2020 年 2 月 24 日
  • 筆記

前言

在我們開發中可能需要設計一次性應用程式,這些實用程式可以利用接近原始源程式碼的優勢,但可以在與主Web應用程式完全獨立的安全性上下文中啟動。具體在 [管理過程](https://12factor.net/admin-processes)中也已經列出了原因。

創建控制台應用

打開命令提示符,創建創建一個ConsoleDemo的文件夾,鍵入如下片段

dotnet new console    dotnet run
dotnet run    Hello World!

或者我們還可以通過 dotnet build 來編譯程式碼,無需運行已生成的控制台應用程式,這回基於項目的名稱將已編譯的應用程式作為DLL文件生成。在這種情況下,創建的文件命名為 ConsoleDemo.dll 。此時我們可以使用Windows上的dotnet binDebugnetcoreapp3.1ConsoleDemo.dll 運行(非 Windows 系統使用 /)。

dotnet binDebugnetcoreapp3.1ConsoleDemo.dll    Hello World!

在編譯應用時,會隨ConsoleDemo.dll一起創建特定於作業系統可執行文件。在Windows上,這將是ConsoleDemo.exe;在Linux或者macOS上,這將是ConsoleDemo.在上面的示例中,用ConsoleDemo.exeConsoleDemo命名該文件。可以直接運行該可執行文件。

.binDebugnetcoreapp3.1ConsoleDemo.exe    Hello World!

HelloWord

首先我們先引入到我們控制台應用中如下包

Install-Package  McMaster.Extensions.CommandLineUtils

Attribute API

using System;  using McMaster.Extensions.CommandLineUtils;    public class Program  {      public static int Main(string[] args)          => CommandLineApplication.Execute<Program>(args);        [Option(Description = "The subject")]      public string Subject { get; }        [Option(ShortName = "n")]      public int Count { get; }        private void OnExecute()      {          var subject = Subject ?? "world";          for (var i = 0; i < Count; i++)          {              Console.WriteLine($"Hello {subject}!");          }      }  }

Builder API

using System;  using McMaster.Extensions.CommandLineUtils;    public class Program  {      public static int Main(string[] args)      {          var app = new CommandLineApplication();            app.HelpOption();          var optionSubject = app.Option("-s|--subject <SUBJECT>", "The subject", CommandOptionType.SingleValue);          var optionRepeat = app.Option<int>("-n|--count <N>", "Repeat", CommandOptionType.SingleValue);            app.OnExecute(() =>          {              var subject = optionSubject.HasValue()                  ? optionSubject.Value()                  : "world";                var count = optionRepeat.HasValue() ? optionRepeat.ParsedValue : 1;              for (var i = 0; i < count; i++)              {                  Console.WriteLine($"Hello {subject}!");              }              return 0;          });            return app.Execute(args);      }  }

上述程式碼直接來自官方….這邊我偷個懶不自己寫了.

我們測試一下

dotnet run -help  Usage:  [options]    Options:    -?|-h|--help            Show help information    -s|--subject <SUBJECT>  The subject    -n|--count <N>          Repeat
dotnet run -s Fh  Hello Fh!

[Command] 這些屬性全部由CommandLineUtils提供,以生成實際的命令行解析器。 Command代表具有」選項」和」參數」的」Command」(轉到數字)。任何裝飾了的類[Command]還必須實現一個稱為OnExecute()或的方法OnExecuteAsync()。返回類型必須為void或int(Task或Task<int>在非同步變數的情況下),並且參數將從您的依賴項注入容器(在這種情況下為Microsoft.Extensions.Dependency.Injection)中注入。

[HelpOption] 有許多帶有單詞」Option」的屬性。這些都增加了命令將接受的命令行選項。在這種情況下,我們希望頂層命令使用默認值-h或–help選項提供幫助。完成此操作後,子命令還將以類似方式提供幫助。

[Subcommand] [Subcommand]屬性對於指示哪些命令將成為當前命令的子命令是必需的。在編譯時知道程式碼中的所有子命令對於基於約定的優化來說已經很成熟了。選擇以當前方式進行組織可以使我們在各個命令之間重用子命令。

Reference

https://natemcmaster.github.io/CommandLineUtils/v2.5/api/McMaster.Extensions.CommandLineUtils.OptionAttribute.html

https://github.com/hueifeng/BlogSample/tree/master/src/ConsoleDemo