.NET Core使用命令行參數庫構建控制台應用程式

来源:https://www.cnblogs.com/yyfh/archive/2020/01/13/12189541.html

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


前言

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

創建控制台應用

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

dotnet new console

dotnet run

dotnet run

Hello World!

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

dotnet bin\Debug\netcoreapp3.1\ConsoleDemo.dll

Hello World!

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


.\bin\Debug\netcoreapp3.1\ConsoleDemo.exe

Hello World!

使用命令行參數庫構建

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


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在非同步變數的情況下),並且參數將從您的依賴項註入容器(在這種情況下為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


您的分享是我們最大的動力!

更多相關文章
  • 定時任務我想大家都不預設,現在流行的框架spring就帶了定時任何 我的個人網站(http://www.yzcopen.com)上用戶上傳的文件都是用這套定時任務執行定時清除 第一步:在applicationContext.xml中加增加以下配置代碼 <!--要調度的對象--> <bean id=" ...
  • 單文件上傳前端頁面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Upload A File</title> </head> <body> <form action="upload.php" method= ...
  • go微服務框架kratos學習筆記六(kratos 服務發現 discovery) [toc] 除了上次的warden直連方式外,kratos有另一個服務發現sdk : "discovery" discovery 可以先簡單理解為一個http服務、 它最簡單的發現過程可能是這樣的: 1、servic ...
  • 處理靜態文件 對於 HTML 頁面中的 css 以及 js 等靜態文件,需要使用使用 net/http 包下的以下 方法來處理 1) StripPrefix 函數 2) FileServer 函數 3) 例如: 會匹配 以 開發的路徑,當瀏覽器請求 頁面中的 s文件時, 首碼會被替換為 ,然後去 目 ...
  • 問題: 在一些特定的情況下,程式中需要用到進位之間的轉化,現在來說說十進位和十六進位的轉化。 其實java進位轉換非常的簡單。 那問什麼還要說這個問題呢? 因為在轉化的時候遇到一個問題。。。 記錄一下,防止再次發生。 一、十六進位轉十進位 1.錯誤的做法 其實對於這種寫法,部分是可以使用的(十六進位 ...
  • 今天在寫gin介面的時候,每次添加或修改個介面都需要重啟項目才能測試,感覺很麻煩。 因為beego有bee工具,bee run啟動項目fsnotify會監控文件變動,經查發現在iris項目中有個插件支持熱重啟。 使用方法如下: # 安裝rizla包 $ go get -u github.com/ka ...
  • 1. 安裝Sentry 2.在settings.py中配置 3.dsn的獲取 4.註意事項 最後,如有問題,請留言。 ...
  • 原文: "https://devblogs.microsoft.com/dotnet/configureawait faq/" .NET 在七多年前在語言和類庫添加了 。在那個時候,它像野火一樣流行,不僅遍及.NET生態系統,而且還可以以多種其他語言和框架進行複製。在利用非同步的其他語言構造,提供非同步 ...
一周排行
  • 該方式是直接對屏幕進行截圖操作UserControl chartContainPanel = new UserControl();Graphics graph = chartContainPanel.CreateGraphics();Size s = chartContainPanel.Size;B... ...
  • dotnetcore3.1 WPF 中使用依賴註入 Intro 在 ASP.NET Core 中預設就已經集成了依賴註入,最近把 "DbTool" 遷移到了 WPF dotnetcore 3.1, 在 WPF 中我們也希望能夠使用依賴註入,下麵來介紹一下如何在 WPF dotnetcore3.1 中 ...
  • 原來的C 程式都有Main的,現在用vs新建一個Wpf項目,啟動似乎變成App.xmal,前期項目中為了獲取啟動參數,很是折騰了一番: 1.先是修改App.xaml,添加StartUp事件 2.然後編輯Application_Startup,判斷e.Args數組 總感覺跟又臭又長的裹腳布一樣,不爽。 ...
  • 冒泡排序原理:(升序)通過當前位置數和後一個位置數進行比較 如果當前數比後一個數大 則交換位置, 完成後 比較基數的位置變成下一個數。直到數組末尾,當程式運行完第一遍 最大的數已經排序到最後一個位置了。次數可以減少迴圈數不用管最後一個數 降序排序同理 不過是把比較方式變成判斷當前數是否小於下一個數 ...
  • 一、前言 這方面的資料很多,重覆的寫沒必要,但是最近一直在學習身份驗證和授權相關東東,為了成體系還是寫一篇,主要是從概念上理解identity系統。 參考:https://www.cnblogs.com/r01cn/p/5179506.html 二、概述 幾乎所有系統都包含用戶、角色、許可權、登錄、註 ...
  • 首先我們使用最簡單的模板案例,裡面有一個Counter計數器,你可以在創建模板中找到。 首先需要設置運行調試方式為IIS Express。這意味著,MAC可能不能使用調試。 然後開啟運行而不調試(Ctrl+F5) 按Shift + Alt + D,會出現一個新的頁面。 如果你想用Chrome調試,復 ...
  • 實體映射時,遇到複雜類型,可選擇下述方法處理: NotMapped,跳過映射 在複雜類型上聲明 [Owned],但僅限該複雜類型是全部由簡單值類型組成的 自定義序列化方法 示例: IPInfo使用了owned,對IPEndPoint使用自定義序列化,對VersionInfo使用JSON序列化 @@@... ...
  • .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect 繼上一篇 ".net core 3 web api jwt 一直 401" 為添加 所述的坑後, 本次為添加 ,又踩坑了。 自從 .NET Core 2.2 之後,CORS跨域配置代碼發 ...
  • 在前一章已經學習過WPF動畫的第一條規則——每個動畫依賴於一個依賴項屬性。然而,還有另一個限制。為了實現屬性的動態化(換句話說,使用基於時間的方式改變屬性的值),需要有支持相應數據類型的動畫類。例如,Button.Width屬性使用雙精度數據類型。為實現屬性的動態化,需要使用DoubleAnimat ...
  • WPF dotnet core 3.1 基於 `Microsoft.Extensions.Localization` 實現基本的多語言支持 ...
x