Codeblox Blog

Source Generators dentro de pacote NuGet

Guilherme
20/02/2022

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>

Pontos importantes:

  1. 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.

  2. À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.

  3. 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.

csharp
dotnet


Guilherme M. Abdo
Guilherme M. Abdo
Desenvolvedor fullstack .Net/Angular/Azure/GitHub