前言
在我们开发中可能需要设计一次性应用程序, 这些实用程序可以利用接近原始源代码的优势, 但可以在与主 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.exe 或 ConsoleDemo 命名该文件. 可以直接运行该可执行文件.
- .\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://www.cnblogs.com/yyfh/p/12189541.html