.NET Core使用命令行参数库构建控制台应用程序

前言

在咱们开发中可能须要设计一次性应用程序,这些实用程序能够利用接近原始源代码的优点,但能够在与主Web应用程序彻底独立的安全性上下文中启动。具体在 [管理过程](https://12factor.net/admin-processes)中也已经列出了缘由html

建立控制台应用

打开命令提示符,建立建立一个ConsoleDemo的文件夹,键入以下片断git

dotnet new console

dotnet run
dotnet run

Hello World!

或者咱们还能够经过 dotnet build 来编译代码,无需运行已生成的控制台应用程序,这回基于项目的名称将已编译的应用程序做为DLL文件生成。在这种状况下,建立的文件命名为 ConsoleDemo.dll 。此时咱们可使用Windows上的dotnet bin\Debug\netcoreapp3.1\ConsoleDemo.dll 运行(非 Windows 系统使用 /)。github

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

Hello World!

在编译应用时,会随ConsoleDemo.dll一块儿建立特定于操做系统可执行文件。在Windows上,这将是ConsoleDemo.exe;在Linux或者macOS上,这将是ConsoleDemo.在上面的示例中,用ConsoleDemo.exeConsoleDemo命名该文件。能够直接运行该可执行文件。api

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

Hello World!

使用命令行参数库构建

首先咱们先引入到咱们控制台应用中以下包安全

Install-Package  McMaster.Extensions.CommandLineUtils

Attribute APIbash

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 APIapp

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

相关文章
相关标签/搜索