チュートリアル: .NET CLI を使用して .NET ツールを作成する

この記事は、.NET 8 SDK 以降のバージョンに適用されます: ✔️

このチュートリアルでは、.NET ツールを作成してパッケージ化する方法について説明します。 .NET CLI を使用すると、他のユーザーがインストールして実行できるコンソール アプリケーションをツールとして作成できます。 .NET ツールは、.NET CLI からインストールされる NuGet パッケージです。 ツールの詳細については、「 .NET ツールの概要」を参照してください。

作成するツールは、現在の.NET環境に関する情報を取得し、.NETバージョン、オペレーティング システムの詳細、環境変数の主要な設定など、それを表示するコンソール アプリケーションです。

このチュートリアルは、3 つのチュートリアルのシリーズの最初のチュートリアルです。 このチュートリアルでは、ツールを作成してパッケージ化します。 次の 2 つのチュートリアルでは、 ツールをグローバル ツールとして使用 し、 そのツールをローカル ツールとして使用します。 ツールを作成する手順は、グローバル ツールとして使用する場合でも、ローカル ツールとして使用する場合も同じです。

[前提条件]

  • .NET SDK 10.0 以降のバージョン。

    このチュートリアルでは .NET SDK 10.0 を使用しますが、このガイドは .NET 8.0 以降に適用されます。

  • 任意のテキスト エディターまたはコード エディター。

プロジェクトを作成する

  1. コマンド プロンプトを開き、 リポジトリという名前のフォルダーを作成します。

  2. リポジトリ フォルダーに移動し、次のコマンドを入力します。

    dotnet new console -n dotnet-env
    

    このコマンドにより、リポジトリ フォルダーの下に dotnet-env という名前の新しいフォルダーが作成されます。

  3. dotnet-env フォルダーに移動します。

    cd dotnet-env
    

コードを追加する

  1. コード エディターで Program.cs ファイルを開きます。

  2. 内容を次のコードに置き換えます。

    using System.Reflection;
    using System.Runtime.InteropServices;
    
    var versionString = Assembly.GetEntryAssembly()?
                            .GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
                            .InformationalVersion
                            .ToString();
    
    Console.WriteLine($"dotnet-env v{versionString}");
    Console.WriteLine(new string('-', 40));
    
    Console.WriteLine();
    Console.WriteLine("Runtime");
    Console.WriteLine($"  .NET Version          {Environment.Version}");
    Console.WriteLine($"  Framework             {RuntimeInformation.FrameworkDescription}");
    Console.WriteLine($"  Runtime Identifier    {RuntimeInformation.RuntimeIdentifier}");
    
    Console.WriteLine();
    Console.WriteLine("System");
    Console.WriteLine($"  OS                    {RuntimeInformation.OSDescription}");
    Console.WriteLine($"  Architecture          {RuntimeInformation.OSArchitecture}");
    Console.WriteLine($"  Machine Name          {Environment.MachineName}");
    Console.WriteLine($"  Processor Count       {Environment.ProcessorCount}");
    
    Console.WriteLine();
    Console.WriteLine("Environment Variables");
    string[] envVars = { "DOTNET_ROOT", "DOTNET_HOST_PATH",
                            "DOTNET_CLI_HOME", "DOTNET_NOLOGO",
                            "NUGET_PACKAGES", "DOTNET_ENVIRONMENT" };
    
    foreach (string name in envVars)
    {
        string? value = Environment.GetEnvironmentVariable(name);
        Console.WriteLine($"  {name,-24}{value ?? "(not set)"}");
    }
    

    このプログラムでは、最上位レベルのステートメントを使用して、 Assembly.GetEntryAssembly()AssemblyInformationalVersionAttributeを使用してアセンブリの情報バージョンを読み取り、次の 3 つのセクションの情報を表示する前に、アプリ名と区切り線を出力します。

    • RuntimeEnvironment.VersionRuntimeInformation を使用した.NETバージョン、フレームワークの説明、ランタイム識別子。
    • システム — OS の説明、アーキテクチャ、コンピューター名、プロセッサ数。
    • Environment 変数 — 6 つの主要な.NET関連変数 (DOTNET_ROOT, DOTNET_HOST_PATHDOTNET_CLI_HOMEDOTNET_NOLOGONUGET_PACKAGES、および DOTNET_ENVIRONMENT)、構成されていないものに対して (not set) が表示されます。

    using System.ReflectionAssembly.GetEntryAssembly()には、AssemblyInformationalVersionAttribute ディレクティブが必要です。 using System.Runtime.InteropServicesには、RuntimeInformation ディレクティブが必要です。

  3. 変更を保存します。

アプリケーションをテストする

プロジェクトを実行し、出力を確認します。

dotnet run

出力は次の例のようになります。

dotnet-env v1.0.0
----------------------------------------

Runtime
  .NET Version          10.0.4
  Framework             .NET 10.0.4
  Runtime Identifier    win-x64

System
  OS                    Microsoft Windows 10.0.22631
  Architecture          X64
  Machine Name          MY-MACHINE
  Processor Count       16

Environment Variables
  DOTNET_ROOT             (not set)
  DOTNET_HOST_PATH        (not set)
  DOTNET_CLI_HOME         (not set)
  DOTNET_NOLOGO           (not set)
  NUGET_PACKAGES          (not set)
  DOTNET_ENVIRONMENT      (not set)

表示される値は、コンピューターとインストール.NETによって異なります。 出力はプラットフォームによって異なります。

ツールをパッケージ化する

アプリケーションをツールとしてパックして配布するには、プロジェクト ファイルを変更します。

  1. dotnet-env.csproj ファイルを開き、<PropertyGroup> ノードの末尾に 3 つの新しい XML ノードを追加します。

    <PackAsTool>true</PackAsTool>
    <ToolCommandName>dotnet-env</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>
    

    <ToolCommandName> は、インストール後にツールを呼び出すコマンドを指定する省略可能な要素です。 この要素が指定されていない場合、ツールのコマンド名はアセンブリ名であり、通常は .csproj 拡張子のないプロジェクト ファイル名です。

    <ToolCommandName>の一意の値を選択します。 ツールがアプリ ホストとしてインストールされ、コマンドに拡張子を含めないようにするため、ファイル拡張子 ( .exe.cmdなど) は使用しないでください。 これにより、既存のコマンドとの競合を防ぎ、スムーズなインストール エクスペリエンスを実現できます。

    <PackageOutputPath> は、.NET が NuGet パッケージを生成する場所を決定するための省略可能な要素です。 .NET CLI では、NuGet パッケージを使用してツールをインストールします。

    プロジェクト ファイルは次の例のようになります。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
    
        <OutputType>Exe</OutputType>
        <TargetFramework>net10.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    
        <PackAsTool>true</PackAsTool>
        <ToolCommandName>dotnet-env</ToolCommandName>
        <PackageOutputPath>./nupkg</PackageOutputPath>
    
      </PropertyGroup>
    
    </Project>
    
  2. dotnet pack コマンドを実行して NuGet パッケージを作成します。

    dotnet pack
    

    dotnet-env.1.0.0.nupkg ファイルは、<PackageOutputPath> ファイルの値で識別されるフォルダーに作成されます。この例では ./nupkg フォルダーです。

    ツールをパブリックにリリースするには、 https://www.nuget.orgにアップロードします。 NuGet でツールを使用できるようになったら、開発者は dotnet ツールのインストール コマンドを使用してツールをインストールできます。 このチュートリアルでは、ローカル nupkg フォルダーから直接パッケージをインストールするため、パッケージを NuGet にアップロードする必要はありません。

トラブルシューティング

チュートリアルの実行中にエラー メッセージが表示される場合は、「.NET ツールの使用に関する問題のトラブルシューティング を参照してください。

次のステップ

このチュートリアルでは、コンソール アプリケーションを作成し、ツールとしてパッケージ化しました。 ツールをグローバル ツールとして使用する方法については、次のチュートリアルに進んでください。

必要に応じて、グローバル ツールのチュートリアルをスキップし、ローカル ツールのチュートリアルに直接移動できます。

こちらも参照ください