在针对消费者代码的 NuGet 库中使用源生成器
Using Source Generators in a NuGet library targeting consumer code
我正在尝试使用新的源代码生成器将我的很多运行时反射内容移动到 AOT,但是我遇到了一些问题。
先说说我的需求吧
- 库的代码需要以 .NET 5 为目标,但不是针对 Source Generator 本身,虽然拥有它会很好,但根据 MS dev-blog 目前还不可能。
- 不应要求源代码生成器本身与原始 NuGet 包分开安装。
现在来看一个更直观的例子,假设包 A 是 NuGet 库,它应该包含包 A 的用户的代码。包 B,包含源代码生成器的包,它应该再次在用户代码上执行-base 而不是包裹 A。包裹 B 应与包裹 A 一起运送。
为什么将 Source Generator 与库一起运送如此重要? SG 将生成库本身所需的代码。
我可能在阅读文档时跳过了某些内容,但是我无法弄明白,假设这是可能的。
事实证明比预期的要容易。通过在父项目的 .csproj 文件中使用 PackagePath
参数将源代码生成器引用为分析器,可以在同一个 NuGet 包中发布源代码生成器。
<ItemGroup>
<None Include="Path\To\SourceGenerator\bin$(Configuration)\netstandard2.0\NameOfSourceGenerator.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
我正在尝试使用新的源代码生成器将我的很多运行时反射内容移动到 AOT,但是我遇到了一些问题。 先说说我的需求吧
- 库的代码需要以 .NET 5 为目标,但不是针对 Source Generator 本身,虽然拥有它会很好,但根据 MS dev-blog 目前还不可能。
- 不应要求源代码生成器本身与原始 NuGet 包分开安装。
现在来看一个更直观的例子,假设包 A 是 NuGet 库,它应该包含包 A 的用户的代码。包 B,包含源代码生成器的包,它应该再次在用户代码上执行-base 而不是包裹 A。包裹 B 应与包裹 A 一起运送。
为什么将 Source Generator 与库一起运送如此重要? SG 将生成库本身所需的代码。
我可能在阅读文档时跳过了某些内容,但是我无法弄明白,假设这是可能的。
事实证明比预期的要容易。通过在父项目的 .csproj 文件中使用 PackagePath
参数将源代码生成器引用为分析器,可以在同一个 NuGet 包中发布源代码生成器。
<ItemGroup>
<None Include="Path\To\SourceGenerator\bin$(Configuration)\netstandard2.0\NameOfSourceGenerator.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>