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) :
- Indiquer sur vos ProjectReference que ce sont des assets privés.
- 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à !
Commentaires