3

Je crée un paquet nuget qui contiendra des fichiers MSBuild .targets et .props selon nuget documentation (nécessite nuget 2.5+).consomme paquet nuget contenant des cibles msbuild avec restauration automatique de paquet

Je prévois l'utiliser avec la restauration automatique de paquet.

Lorsque j'ajoute le paquet résultant à un csproj deux choses se produisent:

Comme on s'y attendait:

<Import Project="..\packages\MyPackage.1.0.0\build\net40\MyPackage.props" Condition="Exists('..\packages\MyPackage.1.0.0\build\net40\MyPackage.props')" /> 
... 
... 
<Import Project="..\packages\MyPackage.1.0.0\build\net40\MyPackage.targets" Condition="Exists('..\packages\MyPackage.1.0.0\build\net40\MyPackage.targets')" /> 

Non prévu:

<PropertyGroup> 
<RestorePackages>true</RestorePackages> 
... 
</PropertyGroup> 
... 
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> 
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 
    <PropertyGroup> 
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> 
    </PropertyGroup> 
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> 
    ... 
</Target> 

C'est le comportement 'non prévu' est l'échafaudage de restauration de package intégré MSBuild.

J'ai enlevé cet échafaudage manuellement selon le documentation mais lorsque je soumets le projet à un serveur de construction, la commande automaitc-package-restore semble rajouter l'échafaudage, ce qui entraîne une erreur de construction. Est-ce que quelqu'un a un moyen de bloquer/d'empêcher l'inclusion de cet échafaudage lorsque le paquet contient des cibles msbuild?

mise à jour

Au lieu d'une solution, j'ai essayé une solution de contournement. C'est-à-dire, j'ai créé un autre paquet de nuget pour adresser le fichier nuget.targets manquant. Lorsqu'il est ajouté au projet, ce nouveau package inclut lui-même une cible DependnOnTargets EnsureNuGetPackageBuildImports et crée un nuget.targets vide/valide. Cela satisfait la condition déclenchée par l'échafaudage csproj, tout en permettant à la fonction de restauration automatique du paquet de nuget d'être toujours déclenchée sur le serveur de construction.

<Target Name="NuGetPackAutomaticPackageRestorePreBuildWorkaround" BeforeTargets="EnsureNuGetPackageBuildImports" Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')"> 
    <ItemGroup> 
    <PatchTargets Include="$(MSBuildThisFileDirectory)TargetPatches\*.targets"/> 
    </ItemGroup> 
    <Copy 
     SourceFiles="@(PatchTargets)" 
     DestinationFolder="$(SolutionDir)\.nuget\"/> 
</Target> 
+0

Au lieu d'une solution, j'ai trouvé une solution de contournement. C'est-à-dire, j'ai créé un autre paquet de nuget pour adresser le fichier nuget.targets manquant. Lorsqu'il est ajouté au projet, ce nouveau package inclut lui-même une cible DependnOnTargets EnsureNuGetPackageBuildImports et crée un nuget.targets vide/valide. Cela satisfait la condition déclenchée par l'échafaudage csproj, tout en permettant à la fonction de restauration automatique du paquet de nuget d'être toujours déclenchée sur le serveur de construction. – user1920322

Répondre

0

Le dossier dans lequel réside la solution contient-il un dossier .nuget? Si oui, essayez de supprimer cela.

Je suis en train de peaufiner une solution qui utilisait l'ancienne méthode de restauration de paquetage (avant la mise à jour 2.7) et qui présentait le même problème jusqu'à ce que je supprime ce dossier.