はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】.NET10から登場したdnx(dotnet tool exec)でdotnet toolのインストール・実行・破棄までを1コマンドで実現する

はじめに

今回は.NET10から登場したdnx (dotnet tool exec)について紹介したいと思います。

learn.microsoft.com

概要

これの発想としてはNode.jsのnpxと同じです。dotnet toolをインストール、実行、破棄までを1つのコマンドで実行してくれます。CI/CDではかなり重宝されそうです。

# dotnetsayというdotnet toolをnugetからインストールして実行する
# --yesを付与すると質問を自動でyesで回答する
$ dnx dotnetsay --yes "Hello, World!" 
        Hello, World!
    __________________
                      \
                       \
                          ....
                          ....'
                           ....
                        ..........
                    .............'..'..
                 ................'..'.....
               .......'..........'..'..'....
              ........'..........'..'..'.....
             .'....'..'..........'..'.......'.
             .'..................'...   ......
             .  ......'.........         .....
             .                           ......
            ..    .            ..        ......
           ....       .                 .......
           ......  .......          ............
            ................  ......................
            ........................'................
           ......................'..'......    .......
        .........................'..'.....       .......
     ........    ..'.............'..'....      ..........
   ..'..'...      ...............'.......      ..........
  ...'......     ...... ..........  ......         .......
 ...........   .......              ........        ......
.......        '...'.'.              '.'.'.'         ....
.......       .....'..               ..'.....
   ..       ..........               ..'........
          ............               ..............
         .............               '..............
        ...........'..              .'.'............
       ...............              .'.'.............
      .............'..               ..'..'...........
      ...............                 .'..............
       .........                        ..............
        .....

ちなみにdotnetsay自体は有名な実験用のdotnet toolですので安心してください。ただ引数に渡した値を返してくれるだけのdotnet toolです。
NuGet Gallery | dotnetsay 2.1.7

また最近のAIブームに関連して、mcp serverを活用する際にも効果を発揮してくれると思ってます。例えば以下のMCP Serverの作成方法を紹介する記事でもばっちりNuGet + dnxを活用していますね。
t.co

使い方

現状はpreview版の.NET 10を入れる必要があります。具体的には.NET 10 SDK Preview 6以上です。

dotnet.microsoft.com

devblogs.microsoft.com

ちなみに現在(2025/8/18)ではpreview7まで出ています。

細かいオプション

$ dotnet tool exec --help                     
Description:             
  ツールを永続的にインストールすることなく、ソースから実行します。

使用法:
  dotnet tool execute <packageId> [<commandArguments>...] [options]

引数:
  <PACKAGE_ID>        'Newtonsoft.Json' のようなパッケージ識別子の形式のパッケージ参照、または 'Newtonsoft.Json@13.0.3' のような '@' で区切られたパッケージ識別子とバージョンです。
  <commandArguments>  ツールに渡された引数

オプション:
  --version <バージョン>         インストールするツール パッケージのバージョン。
  -y, --yes                 [はい] を使用して、すべての確認プロンプトを受け入れます。 [default: False]
  --interactive             コマンドを停止して、ユーザーの入力またはアクション (認証の完了など) を待機できるようにします。 [default: True]
  --allow-roll-forward      対象となるランタイムがインストールされていない場合、.NET ツールが新しいバージョンの .NET ランタイムにロールフォワードできるようにします。 [default: False]
  --prerelease              プレリリース パッケージが含まれます。 [default: False]
  --configfile <ファイル>       使用する NuGet 構成ファイル。
  --source <ソース>            インストール中に使用するすべての NuGet パッケージ ソースをこれらに置き換えます。
  --add-source <ADDSOURCE>  インストール中に使用する他の NuGet パッケージ ソースを追加します。
  --disable-parallel        複数のプロジェクトを並行して復元できないようにします。 [default: False]
  --ignore-failed-sources   パッケージ ソース エラーを警告として処理します。 [default: False]
  --no-http-cache           パッケージと HTTP 要求はキャッシュしません。 [default: False]
  -v, --verbosity <LEVEL>   MSBuild の詳細レベルを設定します。使用可能な値: q[uiet]、m[inimal]、n[ormal]、d[etailed]、diag[nostic]。 [default: normal]
  -?, -h, --help            コマンド ラインのヘルプを表示します。

dnxでも同様のオプションを活用できます。

$ dnx --help                         
Description:
  ツールを永続的にインストールすることなく、ソースから実行します。

使用法:
  dotnet dnx <packageId> [<commandArguments>...] [options]

引数:
  <PACKAGE_ID>        'Newtonsoft.Json' のようなパッケージ識別子の形式のパッケージ参照、または 'Newtonsoft.Json@13.0.3' のような '@' で区切られたパッケージ識別子とバージョンです。
  <commandArguments>  ツールに渡された引数

オプション:
  --version <バージョン>         インストールするツール パッケージのバージョン。
  -y, --yes                 [はい] を使用して、すべての確認プロンプトを受け入れます。 [default: False]
  --interactive             コマンドを停止して、ユーザーの入力またはアクション (認証の完了など) を待機できるようにします。 [default: True]
  --allow-roll-forward      対象となるランタイムがインストールされていない場合、.NET ツールが新しいバージョンの .NET ランタイムにロールフォワードできるようにします。 [default: False]
  --prerelease              プレリリース パッケージが含まれます。 [default: False]
  --configfile <ファイル>       使用する NuGet 構成ファイル。
  --source <ソース>            インストール中に使用するすべての NuGet パッケージ ソースをこれらに置き換えます。
  --add-source <ADDSOURCE>  インストール中に使用する他の NuGet パッケージ ソースを追加します。
  --disable-parallel        複数のプロジェクトを並行して復元できないようにします。 [default: False]
  --ignore-failed-sources   パッケージ ソース エラーを警告として処理します。 [default: False]
  --no-http-cache           パッケージと HTTP 要求はキャッシュしません。 [default: False]
  -v, --verbosity <LEVEL>   MSBuild の詳細レベルを設定します。使用可能な値: q[uiet]、m[inimal]、n[ormal]、d[etailed]、diag[nostic]。 [default: normal]
  -?, -h, --help            コマンド ラインのヘルプを表示します。

一応細かい補足ですが、厳密には--no-http-cacheというオプションを設定しなければキャッシュが保存されるので、2回目以降は素早く動作させることは可能になります。