はなちるのマイノート

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

【C#】.NET Toolとしてローカルにあるnupkgからインストール&利用する方法

はじめに

今回はローカルにあるnupkgから.NET Toolとしてインストールをして利用する方法を紹介したいと思います。

概要

nuget.orgからインストールする際にはあまり意識したことはないかもしれませんが、GitHub Packagesのprivateなpackageなどそれ以外の場所からpackage取得するにはnuget.configが重要になります。

nuget.configにはどこからパッケージを取得できるようにするかを設定ができます。また認証情報が必要な場合はpackageSourceCredentialsを設定してあげたりします。nuget.orgはデフォルトで設定されているのでnuget.orgしか利用しない場合は意識することがないというわけです。
NuGetレジストリの利用 - GitHub Docs


流れとしては以下の通り。
1. .nupkgを作成する
2. nuget.configでローカルレポジトリの設定をする
3. インストールを行いdotnet-tools.jsonに情報を書き込む

nupkgの作成方法

これは書く必要もないかもしれませんが、nupkgを作成するにはdotnet packを利用します。

$ dotnet pack
  Determining projects to restore...
  /Users/----/Hoge.csproj を復元しました (223 ミリ秒)。
  Hoge -> /Users/----/bin/Release/net8.0/Hoge.dll
  パッケージ '/Users----/bin/Release/Hoge.1.0.0.nupkg' が正常に作成されました。

またローカルで.NET Toolとして利用したい場合は、出力先フォルダも指定しておくとやりやすいです。

$ dotnet pack -o packages-local

それか.csprojで出力先フォルダを指定するのもありです。

<PackageId>SampleTool</PackageId>
<PackAsTool>true</PackAsTool>
<ToolCommandName>SampleTool</ToolCommandName>
<PackageOutputPath>./packages-local</PackageOutputPath>

以下は組み込んだ例です。

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        
        <PackageId>SampleTool</PackageId>
        <PackAsTool>true</PackAsTool>
        <ToolCommandName>SampleTool</ToolCommandName>
        <PackageOutputPath>./packages-local</PackageOutputPath>
    </PropertyGroup>
</Project>

nuget.configの作成方法

以下のコマンドでテンプレートを作成できます。

$ dotnet new nugetconfig
テンプレート "NuGet Config" が正常に作成されました。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
    <clear />
    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
</configuration>

ローカルバッケージを追加したい場合は、.nupkgが入っているフォルダへのパスを記述します。

<add key="local" value="./packages-local" />

以下は実際に組み込んだ例です。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
    <clear />
    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
    <add key="local" value="./packages-local" />
  </packageSources>
</configuration>

dotnet tool installを行う

これで設定は完了です。実際にdotnet tool installを行い、無事に.NET Toolとしてインストールされdotnet-tools.jsonに情報が記述されるか確認してみます。

また.config/dotnet-tools.jsonをまだ作成していない場合は、以下のコマンドを実行します。

$ dotnet new tool-manifest

準備は整ったのでインストールしてみます。

# SampleToolの箇所はそれぞれ適切な名前に変更してください
$ dotnet tool install SampleTool
次のコマンドを使用してこのディレクトリからツールを呼び出すことができます: 'dotnet tool run SampleTool' または 'dotnet SampleTool'。
ツール 'sampletool' (バージョン '1.0.0') が正常にインストールされました。マニフェスト ファイル /Users/----/.config/dotnet-tools.json にエントリが追加されました。

正しく動作していればdotnet-tools.jsonに書き込まれているはずです。

{
  "version": 1,
  "isRoot": true,
  "tools": {
    "sampletool": {
      "version": "1.0.0",
      "commands": [
        "SampleTool"
      ],
      "rollForward": false
    }
  }
}