🎃

.NETのNuGetパッケージからアプリにglobal usingを自動で追加する

2023/05/15に公開

はじめに

C#10.0で、ImplicitUsingsという機能が追加されました。

たとえばASP.NETプロジェクトで頻繁に利用されるパッケージは、一々using宣言しなくても、利用できるようになっています。

本稿では、自作のNuGetパッケージで、利用者プロジェクトに任意のglobal usingを自動で追加する方法を紹介します。

目的

システム全体でよく利用する拡張メソッドなどを、NuGetパッケージとして公開したいとします。たとえば私は、つぎのようなコードがあまり好きじゃないです。

static void Foo(IEnumerable<int> values)
{
    if (values.Any() is false)
    {
        Console.WriteLine("Hello, Global Usings!");
    }
}

つぎのように書きたいです。

static void Foo(IEnumerable<int> values)
{
    if (values.Empty())
    {
        Console.WriteLine("Hello, Global Usings!");
    }
}

そのため、つぎのような拡張メソッドを良く作ります。

namespace Extensions;

public static class EnumerableExtensions
{
    public static bool Empty<T>(this IEnumerable<T> enumerable)
    {
        return enumerable.Any() is false;
    }
}

これ自体は良いのですが、拡張メソッドの名前空間は分かりにくく、使いたいとなったときに迷子になることがよくあります。こんな時に、パッケージを参照していたら自動的にglobal usingが追加されると非常に便利です。

手順

.propsを作成する

拡張メソッドを定義するクラスライブラリプロジェクトに、「プロジェクト名 .props」というテキストファイルを追加します。先の例では、Extensions.propsというファイル名になります。

そして、つぎのような内容を記述します。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <Using Include="Extensions" />
  </ItemGroup>

</Project>

これをNuGetパッケージに含めることで、利用者プロジェクトに自動的にglobal usingが追加されます。

.propsをパッケージに含める

クラスライブラリプロジェクトの .csprojにつぎのような記述を追加します。

  <ItemGroup>
    <!-- Only for .NET 6, default implicit Using. -->
    <None Include="Extensions.props" Pack="true" PackagePath="build" />
  </ItemGroup>

NuGetパッケージのbuildフォルダーに、Extensions.propsが含まれるようになります。

あとはパッケージを作成するだけです。

以上です。

Discussion