Este é um guia rápido de como configurar um projeto de Source Generator para que seja utilizado como um pacote NuGet.
A instrução que vou apresentar aqui pode ser encontrada neste guia oficial.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- Atualmente projetos de Source Generator precisam utilizar o netstandar2.0 -->
<TargetFramework>netstandard2.0</TargetFramework>
<!-- 1. Não incluir o generator como uma dependência de lib -->
<IncludeBuildOutput>false</IncludeBuildOutput>
</PropertyGroup>
<ItemGroup>
<!-- Pacotes necessáros para a construção dos Generators, referenciados de forma privada -->
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.1" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3" PrivateAssets="all" />
<!-- 2. Coloque referências publicas aos pacotes que seu código gerado irá depender. Exemplo abaixo com o Newtonsoft -->
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
<!-- 3. É necessário que a dll do gerador fique na pasta analyzer do pacote NuGet -->
<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
</Project>
Desabilitando a opção IncludeBuildOuptut
vai impedir que a dll do projeto de SourceGenerators seja referênciada no projeto onde será instalado o pacote NuGet. Sem isso, seria possível referenciar as classes de geração no projeto de destino, e isso não é interessante.
Às vezes queremos gerar código que dependem de outros pacotes. Ao referenciarmos os pacotes sem a opção PrivateAssets="all"
, eles serão automaticamente instalados nos projetos.
No ponto 1 removemos a inclusão da dll do diretório de output padrão. Agora é necessário que ela seja incluída no diretório analyzers/dotnet/cs
para que o dotnet encontre o assembly de geração de código.