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


    前言

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

    创建控制台应用

    打开命令提示符,创建创建一个ConsoleDemo的文件夹,键入如下片段

    dotnet new console
    
    dotnet run
    
    
    dotnet run
    
    Hello World!
    

    或者我们还可以通过 dotnet build 来编译代码,无需运行已生成的控制台应用程序,这回基于项目的名称将已编译的应用程序作为DLL文件生成。在这种情况下,创建的文件命名为 ConsoleDemo.dll 。此时我们可以使用Windows上的dotnet binDebug etcoreapp3.1ConsoleDemo.dll 运行(非 Windows 系统使用 /)。

    dotnet binDebug
    etcoreapp3.1ConsoleDemo.dll
    
    Hello World!
    

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

    
    .inDebug
    etcoreapp3.1ConsoleDemo.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

  • 相关阅读:
    两种四元数插值的区别
    欧拉角与万向锁
    Unity3D 中脚本丢失问题
    Unity3D 中的定时器
    Unity3D Layout 快捷键
    Sublime Text 2 代码片断
    使用 Box2D 做一个 JansenWalker 机器人
    使用 Sublime Text 2 开发 Unity3D 项目
    Ant 常用语法及选项
    OC基础数据类型-NSNumber
  • 原文地址:https://www.cnblogs.com/yyfh/p/12189541.html
Copyright © 2020-2023  润新知