はじめに
先日dotnet tool
が要求している.NET SDKのバージョンを調べることができるOSSを公開しました。
dotnet toolが要求する.NET SDKの情報を取得できるOSSを公開しました!
— はなちる@ゲーム制作 (@hanaaaaaachiru) May 6, 2025
PowerShellのモジュールなのでmac・windows・linuxで簡単に利用することができます
特にActionsでdotnet toolを利用する際にどのversionをsetup-dotnetすれば良いか(追従)みたいなケースだと有用かと!https://t.co/NeTpXq8rq1 pic.twitter.com/vrMTQ6gjFS
今回はそれを紹介したいと思います。
モチベ
dotnet tool
を活用したGitHub Actionsのワークフローを作成することが普段C#に馴染みのある方ならあるかなと思います。その際にdotnet tool
が要求する.NET SDKのバージョンを検出し、それに応じてactions/setup-dotnet
できたらいいのにな思いました。それがOSSを作成する発端になります。
一応actions/setup-dotnet
はglobal.json
を読み込んでセットアップできるので、自分で作成しているものであればそれを読み込むとかでも良いとは思います。
steps: - uses: actions/checkout@v4 - uses: actions/setup-dotnet@v4 with: global-json-file: csharp/global.json - run: dotnet build <my project> working-directory: csharp
DotnetToolInspectorとは
DotnetToolInspector
はインストール済みのdotnet tool
のruntimeconfig.json
を取得することができるPowerShellのモジュールです。最初はdotnet cli
でそこら辺調べられるのかなと思っていたのですが、調べても全然見つからなかったので自分で作ってみました。
runtimeconfig.json
ってなんやねんと思うかと思いますが、global.json
に書き込まれた内容などを元にビルド時に作成される.NETアプリケーションの実行時設定を定義するためのJSONファイルです。
learn.microsoft.com
{ "runtimeOptions": { "tfm": "net6.0", "rollForward": "LatestMajor", "framework": { "name": "Microsoft.NETCore.App", "version": "6.0.0" }, "configProperties": { "System.Reflection.Metadata.MetadataUpdater.IsSupported": false } } }
上記はdotnet-t4 v3.0.0
のruntimecofig.json
の中身ですが、tfm(Target Framework Moniker)
より.NET 6.0
向けにビルドされていることが分かり、rollForward
がLatestMajor
でframework.version
が6.0.0
なのでバージョンが6.0.0
以上なら動作することが分かります。
learn.microsoft.com
インストール方法
PowerShellのモジュールなので、PowerShellがインストールされている環境で下記コマンドを実行してください。
$ Install-Module -Name DotnetToolInspector
またGitHub Actionsで利用したい場合はaction.yml
が提供されているのでそちらを利用してください。
- name: Example -global uses: hanachiru/DotnetToolInspector@main with: package-id: dotnet-t4 command-name: t4 global: true
DotnetTool RuntimeConfig Inspector · Actions · GitHub Marketplace · GitHub
使い方
どの利用方法をするにしても、インストール済であるdotnet tool
を解析してruntimeconfig.json
を取り出します。ですので、マシンにインストールされていないと情報を取得できないので注意してください。ローカルツールではdotnet tool restore
を実行する必要があります。
PowerShellを利用する場合
# for 'dotnet tool install dotnet-t4 --local' $ Get-DotnetToolRuntimeConfig -packageID "dotnet-t4" -commandName "t4" { "runtimeOptions": { "tfm": "net6.0", "rollForward": "LatestMajor", "framework": { "name": "Microsoft.NETCore.App", "version": "6.0.0" }, "configProperties": { "System.Reflection.Metadata.MetadataUpdater.IsSupported": false } } } # for 'dotnet tool install dotnet-t4 --tool-path <path-to-your-tool-path>' $ Get-DotnetToolRuntimeConfig -packageID "dotnet-t4" -commandName "t4" -toolPath "path\to\your\tool-path" { "runtimeOptions": { "tfm": "net6.0", "rollForward": "LatestMajor", "framework": { "name": "Microsoft.NETCore.App", "version": "6.0.0" }, "configProperties": { "System.Reflection.Metadata.MetadataUpdater.IsSupported": false } } } # for 'dotnet tool install dotnet-t4 --global' $ Get-DotnetToolRuntimeConfig -packageID "dotnet-t4" -commandName "t4" -global { "runtimeOptions": { "tfm": "net6.0", "rollForward": "LatestMajor", "framework": { "name": "Microsoft.NETCore.App", "version": "6.0.0" }, "configProperties": { "System.Reflection.Metadata.MetadataUpdater.IsSupported": false } } }
GitHub Actionsで利用する場合
--local
- name: Example -local uses: hanachiru/DotnetToolInspector@main with: package-id: dotnet-t4 command-name: t4 working-directory: ./Tests/Data/local
working-directory
を利用して、プロジェクトへのパスを指定してあげてください。
dotnet-tools.json
を読み取り、そこからキャッシュされているdotnet tool
を読み取ります。
--tool-path
# Check .NET SDK Version - name: Example -toolPath id: toolpath uses: hanachiru/DotnetToolInspector@main with: package-id: dotnet-t4 command-name: t4 tool-path: ./Tests/Data/tool-path
tool-path
を指定してあげます。
--global
- name: Example -global uses: hanachiru/DotnetToolInspector@main with: package-id: dotnet-t4 command-name: t4 global: true
global: true
を指定してあげます。
さいごに
割と便利だなと思うものの、マシンにインストール済みでないと調べれないのがやや難点かなという気はしています。nuget.org
あたりからいい感じに情報取得できるようになったり良いのかなと思ったりしつつ、そこらへん後で見てみようかなと思います。