.NET Core Global Toolsは.NET Core SDKがインストールされている環境でdotnet系cliツールをlist/install/upgrade/uninstallを行う仕組みです。
https://docs.microsoft.com/ja-jp/dotnet/core/tools/global-tools
この仕組みがでたことで、少なくともdotnet core製のCLIツールの配布はnugetを経由することで統合的に行うことができるようになりました。 おおむねnpmと同様の感覚で使えるため、npmが入っておらずdotnetだけがはいった環境で便利です。
例えば、CI環境では.NET Coreビルド時に .NET Core SDKは入っているけどnpmはない、など特定のシーンで強力に機能します。 さて、今回はこのインストール、アップグレードに関してみてみましょう。
インストールとアップグレードをまとめて行いたい
.NET Core Global Toolsは、インストールにdotnet tool install、アップグレードにdotnet tool upgradeとそれぞれ別のコマンドを用います。
dockerなど、環境が使い捨ての場合はこれで十分なのでシンプルさはとてもいいことです。
一方で、すでにツールxxxxがインストールされている環境でdotnet tool install --global xxxxを行うとexit code 1が生じ、インストールされていない環境でdotnet tool upgrade xxxxを行うとexit code 1が生じます。
つまり、ホスト環境など「すでにツールがインストールされている環境」に対してツールのインストールを保証するシーンではひと手間加える必要があります。
ではUnityBuildRunnerを例にサクッと書いてみましょう。
サンプルはリポジトリに置いておきます。
https://github.com/guitarrapc/dotnet-lab/tree/master/dotnet_global_tools/installorupgrade
cmd (Windows環境)
もしbashが使えないgowなども利用できないWindows環境の場合、batで保証するように書いてみましょう。 よくあるコマンドの存在を確認して切り替えれば十分でしょう。
dotnet tool list -g | findstr unitybuildrunner
if ('%errorlevel%' == '1') (
dotnet tool install --global UnityBuildRunner --version 1.1.5
) else (
dotnet tool update --global UnityBuildRunner
)
bash
linux環境ではcommandを使って探したいところですが、dotnet自体は成功してしまうのでlistからgrepしてお茶を濁します。
if dotnet tool list -g | grep unitybuildrunner;
then
dotnet tool update --global UnityBuildRunner
else
dotnet tool install --global UnityBuildRunner --version 1.1.5
fi
まとめ
dotnetコマンドで保証してくれてもいい気もしつつ、まぁ仕方ない。
Ref
解消するっぽい....? 未インストール状態で、dotnet tool update -g unitybuildrunnerは今のところだめっぽい。