Loupe

Nuget - inclure les ProjectReference dans vos packages

Lorsque l'on écrit du code susceptible d'être utilisé sur plusieurs projets, on aime bien faire des packages nuget pour pouvoir le réinjecter un peu partout et ne le maintenir qu'une seule fois. Souvent, on référence un autre projet de notre solution via la balise ProjetReference dans notre fichier csproj et on s'attend à ce que le projet référencé soit également présent dans le package nuget généré. Que nenni : il faudra lui aussi l'exposer sous la forme d'un package Nuget.

Dans cet article, nous verrons comment contourner ce problème que Microsoft a prévu de corriger depuis novembre 2016 pour l'inclure dans le package Nuget.

 

La solution de contournement se trouve un peu plus bas dans l'issue Github (il n'y a que 183 commentaires à lire après tout) :

  1. Indiquer sur vos ProjectReference que ce sont des assets privés.
  2. Ajouter une Target msbuild pour copier vos dll dans la sortie de votre package.

On se retrouve donc avec ce type de csproj : 

 <PropertyGroup>
   <TargetFramework>netstandard2.1</TargetFramework>
   <IsPackable>true</IsPackable>
   <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<ItemGroup>
  <ProjectReference 
     Include="..\Chemin\Projet.csproj" 
     PrivateAssets="all" />
</ItemGroup>
<Target 
  Name="CopyProjectReferencesToPackage" 
 DependsOnTargets="ResolveReferences">
  <ItemGroup>
    <BuildOutputInPackage 
         Include="@(ReferenceCopyLocalPaths->;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
  </ItemGroup>
</Target>

La propriété TargetsForTfmSpecificBuildOutput est utilisée pour contenir tous les fichiers à inclure dans votre package Nuget. Ici, on l'a remplie via une Target CopyProjectReferencesToPackage avec les fichiers copiés localement provenant d'une ProjectReference. Ok ce n'est pas intuitif mais une fois que c'est écrit on n'y touche plus :)

 

Happy coding !

 

PS : si vous voulez aller plus loin pour créer votre propre serveur Nuget, c'est par là !

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus