色んな事を書く

シンプルさを極めたエンジニアになりたい

.NET tools を使ってみる

.NET Core ツールとは

一言でまとめると Console App を Nuget Package 化したものです。詳細は以下に記載があります。

learn.microsoft.com

マニフェストファイルを作る

パッケージのバージョン管理を行うためのファイルを作成します。下記のコマンドを実行すると、

dotnet new tool-manifest

.config/dotnet-tools.json が作成され、下記のような中身になっています。

{
  "version": 1,
  "isRoot": true,
  "tools": {
  }
}

tool をインストールしていくと、こちらの file に追加されていきます。

Strawberry Shake のツールを入れてみる

Strawberry Shake .NET の GrapchQL Client SDK です。まずは以下のコマンドでインストールされているツールを調べます。

dotnet tool list

パッケージ ID      バージョン      コマンド      マニフェスト
-----------------------------------------

上記のように何もインストールされていないことを確認します。この状態で下記コマンドを実行すると、

dotnet tool install StrawberryShake.Tools
dotnet tool list

パッケージ ID                   バージョン       コマンド                マニフェスト
-------------------------------------------------------------------------------------------------------------------------------------
strawberryshake.tools      13.9.0      dotnet-graphql    .config\dotnet-tools.json

インストールされました。version は執筆時 (2024/4/14) の最新の安定板の 13.9.0 となっています。install コマンドの構文はこちらにあります。

マニフェストファイルにも反映されました。

{
  "version": 1,
  "isRoot": true,
  "tools": {
    "strawberryshake.tools": {
      "version": "13.9.0",
      "commands": [
        "dotnet-graphql"
      ]
    }
  }
}

update してみる

tool の version を上げるには update を使います。まずは適当な version の tool をインストールします。

dotnet tool install --version 13.8.1  StrawberryShake.Tools
dotnet tool list

パッケージ ID                   バージョン       コマンド                マニフェスト
-------------------------------------------------------------------------------------------------------------------------------------
strawberryshake.tools      13.8.1      dotnet-graphql    .config\dotnet-tools.json

update をコマンドを使って version を上げます。

dotnet tool update --version 13.9.0 StrawberryShake.Tools
dotnet tool list

パッケージ ID                   バージョン       コマンド                マニフェスト
-------------------------------------------------------------------------------------------------------------------------------------
strawberryshake.tools      13.9.0      dotnet-graphql      .config\dotnet-tools.json

version は指定しなければ最新の安定板に更新されます。構文はこちらにあります。

downgrade したい場合に update コマンドは利用できません。例えば version を 13.8.0 として 13.8.1 -> 13.8.0 の downgrade は出来ません。その場合はまず uninstall コマンドを使い、13.8.0 をインストールする必要があります。

dotnet tool を自作してみる

ぜっかくなので dotnet tool を自作してみます。tutrial もあるので割と簡単に入門できます。

learn.microsoft.com

では、引数に受け取った文字列をコンソールに出力する tool を作ってみます。dotnet tool は Console App なので、Console App として project を作成します。

そして project file に以下を追加します。

    <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
    <PackAsTool>true</PackAsTool>
    <ToolCommandName>Toy</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>

そして Program.cs を以下のようにします。

// See https://aka.ms/new-console-template for more information
Console.WriteLine($"Hello! {string.Join(",", args)}");

この状態で run を実行します。

dotnet run "Hoge" "Fuga"
Hello! Hoge,Fuga

すると以下のような出力になります。

では tool として利用できるようにしていきましょう。まずは dotnet pack で NuGet 化させます。

dotnet pack

すると project file の PackageOutputPath に指定したディレクトリ (今回だと nupkg) に project 名と同じ名前の nupkg file が出来上がっているはずです。ではこれを別の prject に tool としてインストールしましょう。

dotnet tool install --add-source path-to-nupkg --version 1.0.0  {Package 名}
dotnet tool list
パッケージ ID                   バージョン       コマンド                マニフェスト
-------------------------------------------------------------------------------------------------------------------------------------
toytool                    1.0.0       Toy                 .config\dotnet-tools.json

--add-source を使って NuGet Package の Source を明示的に指定しています。今回はローカルでの検証なので、参照パスを指定しています。

ToolCommandName に指定したコマンド (今回だと Toy) を使って tool を実行してみましょう。

dotnet Toy "Hoge" "Fuga"
Hello! Hoge,Fuga

コンソールにパラメータが出力されます。意外と簡単ですね。