Como Criar um Pacote NuGet com Referências a Outros Projetos na Mesma Solução

Introdução

Olá, devs! No mundo do desenvolvimento de software, compartilhar código de forma eficiente é fundamental para a produtividade e manutenção de projetos.

Um dos métodos mais populares para isso é através de pacotes NuGet.

Neste post, vamos explorar como criar um pacote NuGet que inclui referências a outros projetos dentro da mesma solução, garantindo que você consiga distribuir suas bibliotecas de maneira eficaz e organizada.

Bora?

C# NuGet

Entendendo o Cenário

Imagine que você está trabalhando em uma solução que contém múltiplos projetos. Um desses projetos depende diretamente de outro dentro da mesma solução.

Para facilitar o gerenciamento e a distribuição, você decide criar um pacote NuGet.

No entanto, ao empacotar seu projeto, você percebe que precisa incluir as referências corretas para que tudo funcione quando o pacote for utilizado em outra solução.

Como fazer isso?

Passo a Passo para Criar o Pacote NuGet

Configuração do Projeto

Primeiro, certifique-se de que todos os projetos na sua solução estão configurados corretamente. Cada projeto deve ter um arquivo .csproj bem definido, com todas as dependências e referências adicionadas.

Modificações no arquivo .csproj

Para incluir referências a outros projetos na mesma solução e garantir que o pacote NuGet seja gerado corretamente, precisamos fazer algumas modificações no arquivo .csproj do projeto principal.

Adicione o seguinte trecho dentro do elemento <PropertyGroup>:

<PropertyGroup>
  <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>

Em seguida, adicione a referência ao projeto dependente com as propriedades necessárias para incluir o assembly de saída:

<ItemGroup>
  <ProjectReference Include="..\DependencyProject\DependencyProject.csproj">
    <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
    <IncludeAssets>DependencyProject.dll</IncludeAssets>
  </ProjectReference>
</ItemGroup>

Por último, inclua o seguinte alvo dentro das tags <Project>:

<Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
  <ItemGroup>
    <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
  </ItemGroup>
</Target>

Exemplo Completo de Arquivo .csproj

Aqui está um exemplo completo de um arquivo .csproj configurado para incluir referências a outros projetos e pronto para empacotamento:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Version>1.0.0</Version>
    <Product>MyProduct</Product>
    <PackageId>MyProduct</PackageId>
    <Authors>YourName</Authors>
    <Company>CompanyName</Company>
    <Description>Descrição do meu pacote</Description>
    <Copyright>Copyright © 2024 MyCompany</Copyright>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SomeNugetPackage" Version="1.2.3"/>
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\DependencyProject\DependencyProject.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>DependencyProject.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
</Project>

Adicionando uma DLL Externa

Ok, agora que já aprendemos a adicionar DLLs que estão na mesma solução, como seria adicionar somente uma DLL externa que não é um projeto?

Você pode usar o seguinte trecho de código no seu arquivo .csproj:

<ItemGroup>
  <Content Include="<path to other dll>">
    <Pack>true</Pack>
    <PackagePath>lib\$(TargetFramework)</PackagePath>
  </Content>
</ItemGroup>

Este código assegura que a DLL externa será incluída no pacote NuGet, tornando-a disponível para qualquer projeto que consumir o pacote.

Conclusão e Dicas Finais

Criar um pacote NuGet com referências a outros projetos na mesma solução pode parecer complicado à primeira vista, mas com a configuração correta, o processo se torna bem mais simples. Lembre-se de sempre verificar se todas as dependências estão devidamente incluídas e testadas.

Espero que este guia tenha sido útil e que você esteja pronto para criar seus próprios pacotes NuGet com múltiplas dependências

E aí, o que achou? Gostou?

Até!