こんにちは。MLBお兄さんこと松村です。
連休中の勉強ネタとして .NET Core のグローバルツールを勉強してみました。
.NET Coreグローバルツールとは
公式ドキュメントにはこのように記されています。
.NET Core グローバル ツールは、コンソール アプリケーションを含む特殊な NuGet パッケージです。 グローバル ツールは、PATH 環境変数に含まれている既定の場所またはカスタムの場所のマシンにインストールできます。
つまり dotnet
コマンドを拡張するためにインストールすることができるツールです。
npm install -g {package}
でインストールできる、npmのグローバルツールのようなものです。
仕組み
dotnet tool install -g {ツール名}
でグローバルツールをインストールします。
このとき指定されたツールは %USERPROFILE%\.dotnet\tools
に配置されます。(LinuxやmacOSでは $HOME/.dotnet/tools
となる)
このディレクトリにパスを通すことで、端末内のどこでも実行できることになります。
また .NET Coreグローバルツールは2種類の実行方法があります。
dotnet <toolName>
<toolName>
つまり dotnet
をつけるかどうかの違いになりますが、実行形式ファイルのファイル名の付け方によって呼び出し方が変わります。
dotnet-<toolName>.exe
->dotnet <toolName>
<toolName>.exe
-><toolName>
作り方
.NET Coreグローバルツールはもちろん自作することができます。
詳しくはこちらのドキュメントをご覧ください。
ざっくり説明すると、下記のルールで作っていけば良いです。
- コンソールアプリケーションであること (
dotnet new console
) - ツールとして使用することを csproj ファイルに記述する
<PackAsTool>
<ToolCommandName>
<PackageOutputPath>
- .nupkg ファイルとしてパッケージを作成する (
dotnet pack
)
サンプルを作ってみた
ということで勉強がてらサンプルを作ってみました。
yuta> dotnet tool install -g dotnet-mlb 次のコマンドを使用してツールを呼び出せます。dotnet-mlb ツール 'dotnet-mlb' (バージョン '0.2.0') が正常にインストールされました。 yuta> yuta> dotnet mlb https://www.mlb.com/ yuta> yuta> dotnet mlb --teams === American League === Baltimore Orioles Boston Red Sox New York Yankees Tampa Bay Rays Toronto Blue Jays Chicago White Sox Cleveland Indians Detroit Tigers Kansas City Royals Minnesota Twins Houston Astros Los Angeles Angels Oakland Athletics Seattle Mariners Texas Rangers === National League === Atlanta Braves Miami Marlins New York Mets Philadelphia Phillies Washington Nationals Chicago Cubs Cincinnati Reds Milwaukee Brewers Pittsburgh Pirates St. Louis Cardinals Arizona Diamondbacks Colorado Rockies Los Angeles Dodgers San Diego Padres San Francisco Giants
(特に意味のないジョークツールですw)
自作した .NET Coreツールを公開する
自作した .NET CoreツールはNuGetに公開することで他のユーザーにも配布することができます。
NuGetに手動でアップロードして公開するなら、こちらのドキュメントが参考になります。
私が勉強用に作った dotnet-mlb も NuGet に公開していますので、良かったら使ってみてください。
Azure DevOpsで自動化する
.NET Core ツールを修正するたびに手動で公開作業するのは愚の骨頂です。自動化できるものは自動化しちゃいましょう。
今回はAzure DevOpsを使って、公開作業を自動化してみます。
※Azure DevOpsアカウントの作成手順は省略します。
プロジェクトを作成する
Azure DevOpsのトップ画面の [New project] からプロジェクトを作成します。
このときプロジェクト名は組織のなかでユニークになるようにしましょう。
パッケージ作成のパイプラインを構成する
次に .NET Core ツールのソースコードからパッケージを作成するパイプラインを構成します。
[Pipelines] > [Builds] > [New pipeline] と進み、ビルドパイプラインを作成します。今回はGUIでパイプラインを構成します。
ソースコードはGitHubなど、自身が保管しているリポジトリを指定します。
なおAzure DevOpsにもAzure Reposという、プライベートGitリポジトリを作成できる機能があります。
パイプラインはいくつかテンプレートが用意されており、今回はASP.NET Coreのテンプレートを使用します。
テンプレートとして dotnet restore
, dotnet build
, dotnet test
, dotnet publish
, Publish Artifact
の5つのタスクが構成されますが、4番目の dotnet publish
を dotnet pack
に変更します。
きちんとビルドパイプライン定義を保存して、自動でパッケージ作成を行うパイプラインの構成が終わりました。
パッケージを nuget.org に自動リリースするパイプラインを構成する
次は自動で作成したパッケージを nuget.org に自動で公開するパイプラインを構成します。
[Pipelines] > [Releases] > [New pipeline] > [Empty job] と進み、空のステージを用意します。
リリース対象として [Add an artifact] にて先程作成したビルドパイプラインを指定します。
また雷マークで、自動ビルドが成功したらリリースパイプラインを自動的に開始する設定にします。
ステージの [1 job, 0 task] > [Agent job] の横の+ボタンから、NuGetのテンプレートを指定し、以下の変更を行います。
- 追加されたタスクのコマンドを
push
に変更します - [Path to solution, packages.config, or project.json] の横の ... から対象の .nupkg ファイルを選択し、ファイル名をアスタリスクに変更します
- [Target feed location] に nuget.org を指定します(こちらを参考に)
きちんとでリリースパイプライン定義を保存して、自動でパッケージを公開するパイプラインの構成が終わりました。
これでCI/CDの構成ができたため、あとはコードを書いてGitリポジトリにプッシュするだけで、.NET Coreツールを公開することができます。