教程:使用 .NET CLI 创建 .NET 工具

本文适用于: ✔️.NET Core 2.1 SDK 及更高版本

本教程介绍如何创建和打包 .NET 工具。 .NET CLI 允许你创建控制台应用程序作为工具,其他人可以安装和运行该应用程序。 .NET 工具是从 .NET CLI 安装的 NuGet 包。 有关工具的详细信息,请参阅 .NET 工具概述

你将创建的工具是一个控制台应用程序,该应用程序采用消息作为输入,并显示消息以及创建机器人图像的文本行。

这是三个教程系列中的第一个教程。 在本教程中,你将创建并打包工具。 在接下来的两个教程中,你将 该工具用作全局工具并将该工具用作本地工具。 无论将其用作全局工具还是本地工具,创建工具的过程都是相同的。

先决条件

  • .NET SDK 6.0.100 或更高版本。

    本教程使用 .NET SDK 6.0,但从 .NET Core SDK 2.1 开始提供全局工具。 本地工具从 .NET Core SDK 3.0 开始可用。

  • 你选择的文本编辑器或代码编辑器。

创建项目

  1. 打开命令提示符并创建名为 存储库的文件夹。

  2. 导航到 存储库 文件夹并输入以下命令:

    dotnet new console -n microsoft.botsay -f net6.0
    

    该命令在存储库文件夹下创建名为 microsoft.botsay 的新文件夹。

    注释

    在本教程中,你将创建面向 .NET 6.0 的工具。 若要以其他框架为目标,请更改 -f|--framework 选项。 若要面向多个框架,请将 TargetFramework 元素更改为 TargetFrameworks 项目文件中的元素,如以下示例所示:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
      </PropertyGroup>
    </Project>
    
  3. 导航到 microsoft.botsay 文件夹。

    cd microsoft.botsay
    

添加代码

  1. 使用代码编辑器打开 Program.cs 文件。

  2. Program.cs 中的代码替换为以下代码:

    using System.Reflection;
    
    namespace microsoft.botsay;
    
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
    

    下一步中添加的代码需要该 using System.Reflection; 指令。

  3. Main 该方法替换为以下代码,以处理应用程序的命令行参数。

    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            var versionString = Assembly.GetEntryAssembly()?
                                    .GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
                                    .InformationalVersion
                                    .ToString();
    
            Console.WriteLine($"botsay v{versionString}");
            Console.WriteLine("-------------");
            Console.WriteLine("\nUsage:");
            Console.WriteLine("  botsay <message>");
            return;
        }
    
        ShowBot(string.Join(' ', args));
    }
    

    如果未传递任何参数,将显示一条简短的帮助消息。 否则,所有参数都串联成单个字符串,并通过调用 ShowBot 在下一步中创建的方法进行打印。

  4. 添加一个名为 ShowBot 采用字符串参数的新方法。 该方法使用文本行打印机器人的消息和图像。

    static void ShowBot(string message)
    {
        string bot = $"\n        {message}";
        bot += @"
        __________________
                          \
                           \
                              ....
                              ....'
                               ....
                            ..........
                        .............'..'..
                     ................'..'.....
                   .......'..........'..'..'....
                  ........'..........'..'..'.....
                 .'....'..'..........'..'.......'.
                 .'..................'...   ......
                 .  ......'.........         .....
                 .    _            __        ......
                ..    #            ##        ......
               ....       .                 .......
               ......  .......          ............
                ................  ......................
                ........................'................
               ......................'..'......    .......
            .........................'..'.....       .......
         ........    ..'.............'..'....      ..........
       ..'..'...      ...............'.......      ..........
      ...'......     ...... ..........  ......         .......
     ...........   .......              ........        ......
    .......        '...'.'.              '.'.'.'         ....
    .......       .....'..               ..'.....
       ..       ..........               ..'........
              ............               ..............
             .............               '..............
            ...........'..              .'.'............
           ...............              .'.'.............
          .............'..               ..'..'...........
          ...............                 .'..............
           .........                        ..............
            .....
    ";
        Console.WriteLine(bot);
    }
    
  5. 保存更改。

测试应用程序

运行项目并查看输出。 请尝试命令行中的这些变体以查看不同的结果:

dotnet run
dotnet run -- "Hello from the bot"
dotnet run -- Hello from the bot

分隔符后 -- 的所有参数都传递给应用程序。

打包工具

在打包和分发应用程序作为工具之前,需要修改项目文件。

  1. 打开 microsoft.botsay.csproj 文件,并将三个新的 XML 节点添加到节点的 <PropertyGroup> 末尾:

    <PackAsTool>true</PackAsTool>
    <ToolCommandName>botsay</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>
    

    <ToolCommandName> 是一个可选元素,指定将在安装该工具后调用该工具的命令。 如果未提供此元素,则工具的命令名称为程序集名称,通常是没有 .csproj 扩展名的项目文件名。

    注释

    <ToolCommandName>. 选择唯一值。 避免使用文件扩展名(如 .exe.cmd),因为该工具作为应用主机安装,并且命令不应包含扩展。 这有助于防止与现有命令发生冲突,并确保顺利安装体验。

    <PackageOutputPath> 是一个可选元素,用于确定要生成 NuGet 包的位置。 NuGet 包是 .NET CLI 用于安装工具的内容。

    项目文件现在如以下示例所示:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
    
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
    
        <PackAsTool>true</PackAsTool>
        <ToolCommandName>botsay</ToolCommandName>
        <PackageOutputPath>./nupkg</PackageOutputPath>
    
      </PropertyGroup>
    
    </Project>
    
  2. 通过运行 dotnet pack 命令创建 NuGet 包:

    dotnet pack
    

    microsoft.botsay.1.0.0.nupkg 文件是在由 microsoft.botsay.csproj 文件中的值标识的文件夹中创建的,在本示例中为 ./nupkg 文件夹。<PackageOutputPath>

    如果要公开发布工具,可以将其 https://www.nuget.org上传到 。 在 NuGet 上提供该工具后,开发人员可以使用 dotnet 工具安装命令安装 该工具。 在本教程中,直接从本地 nupkg 文件夹安装包,因此无需将包上传到 NuGet。

故障排除

如果在遵循本教程时收到错误消息,请参阅 排查 .NET 工具使用问题

后续步骤

在本教程中,你创建了一个控制台应用程序并将其打包为工具。 若要了解如何将该工具用作全局工具,请转到下一教程。

如果需要,可以跳过全局工具教程并直接转到本地工具教程。