🎃
.NETのNuGetパッケージからアプリにglobal usingを自動で追加する
はじめに
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