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