体験するNET Coreコマンドラインアプリケーション-CommandLineUtils

12434 ワード

前言


我々の開発では、元のソースコードに近い利点を利用することができますが、プライマリWebアプリケーションとは完全に独立したセキュリティコンテキストで起動できる使い捨てアプリケーションを設計する必要があります.具体的には[管理プロセス](https://12factor.net/admin-processes)にも理由が記載されています.

コンソールアプリケーションの作成


コマンドプロンプトを開き、ConsoleDemoを作成するフォルダを作成し、次のクリップを入力します.
dotnet new console

dotnet run

dotnet run

Hello World!

あるいはdotnet buildでコードをコンパイルすることもできます.生成されたコンソールアプリケーションを実行する必要はありません.今回はプロジェクト名に基づいてコンパイルされたアプリケーションをDLLファイルとして生成します.この場合、作成するファイルの名前はConsoleDemoです.dll .Windowsのdotnet binDebugetcoreapp 3を使用できます.1\ConsoleDemo.dll運転(Windows以外のシステム使用/).
dotnet bin\Debug
etcoreapp3.1\ConsoleDemo.dll Hello World!

アプリケーションをコンパイルするとき、ConsoleDemoに従います.dllは、オペレーティングシステム固有の実行可能ファイルを作成します.WindowsではConsoleDemoになります.exe;LinuxまたはmacOSでは、これはConsoleDemoになります.上記の例では、ConsoleDemoを用いる.exeまたはConsoleDemoはこのファイルに名前を付けます.実行可能ファイルを直接実行できます.

.\bin\Debug
etcoreapp3.1\ConsoleDemo.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 ", "The subject", CommandOptionType.SingleValue);
        var optionRepeat = app.Option<int>("-n|--count ", "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