web-dev-qa-db-fra.com

Cible de restauration MSBuild - MSB4057: La cible "restauration" n'existe pas dans le projet

Nous avons plus de 20 solutions dans notre portefeuille de produits principal (plus de 880 projets), et nous avons un ensemble complexe de scripts de construction qui fonctionnent bien, mais nous essayons d'automatiser la restauration des paquets de nugets à partir du pipeline msbuild. Actuellement, cela se fait avec un appel manuel à nuget pour restaurer les packages.

Selon https://docs.Microsoft.com/en-us/nuget/schema/msbuild-targets je devrais pouvoir exécuter cette commande et faire exécuter la restauration:

# works
& $script:msBuildPath $solutionName /t:build /v:q /clp:ErrorsOnly /nologo /p:...
# doesn't works
& $script:msBuildPath $solutionName /t:restore,build /v:q /clp:ErrorsOnly /nologo /p:...

Cependant, lorsque j'ajoute le restore, à ce qui précède, il génère une erreur

MSB4057: The target "restore" does not exist in the project

Où dois-je commencer mes recherches pour comprendre pourquoi il ne peut pas trouver cette cible? Nous sommes principalement sur VS 2015 et .NET 4.6.2, donc quelque chose de spécifique à VS2017 n'est pas une option pour moi en ce moment.


Si j'omets le /v:q et /clp:ErrorsOnly drapeaux J'obtiens ceci (noms et chemins de solution/projet légèrement nettoyés)

PS Z:\git\company> build c
building Common\Common.sln
Build started 11/15/2017 11:08:54 AM.
     1>Project "Z:\git\company\Common\Common.sln" on node 1 (restore;build target(s)).
     1>ValidateSolutionConfiguration:
         Building solution configuration "DEBUG|Any CPU".
     1>Z:\git\company\Common\Common.sln.metaproj : error MSB4057: The target "restore" does not exist in the project. [Z:\git\company\Common\Common.sln]
     1>Done Building Project "Z:\git\company\Common\Common.sln" (restore;build target(s)) -- FAILED.

Build FAILED.

       "Z:\git\company\Common\Common.sln" (restore;build target) (1) ->
         Z:\git\company\Common\Common.sln.metaproj : error MSB4057: The target "restore" does not exist in the project. [Z:\git\company\Common\Common.sln]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.03
runBuildPackage :  ... failed
At Z:\git\company\psincludes\buildFunctions.ps1:11 char:5
+     runBuildPackage "Common\Common.sln"
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,runBuildPackage


msbuild failed
At Z:\git\company\psincludes\buildInternals.ps1:63 char:21
+                     throw "msbuild failed";
+                     ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (msbuild failed:String) [], RuntimeException
    + FullyQualifiedErrorId : msbuild failed

Je me rends compte qu'une partie de cela est notre outil interne, je n'ai tout simplement pas ressenti le besoin d'obscurcir cette partie.

Selon "Internet", cela devrait être "gratuit" dans le cadre du processus de construction, et je ne sais pas ce que nous manquons dans les fichiers csproj ici.

10
jcolebrand

La fonctionnalité NuGet intégrée à msbuild est disponible dans NuGet 4.0+ en conjonction avec MSBuild 15, ce qui signifie uniquement dans VS 2017. Il n'y a pas de prise en charge de la cible de restauration pour VS 2015.

La restauration intégrée dans VS 2017/NuGet 4 ne fonctionne que pour les projets utilisant le nouveau style PackageReference de référencement des packages NuGet. Cela ne fonctionne pas pour les projets utilisant packages.config. Cette nouvelle façon de référencer les packages est l'option par défaut pour les projets ASP.NET Core (à la fois sur .NET Framework/.NET Core), .NET Core et .NET Standard. Il est opt-in pour tous les autres types de projets en sélectionnant le style avant la première installation dans les propriétés NuGet (Outils-> Options-> NuGet).

Notez que l'appel de /t:Restore,Build n'est pas un bon moyen d'appeler cette cible, car la restauration peut générer ou modifier des fichiers que msbuild ne recharge pas. MSBuild 15.5 (prochaine mise à jour de VS 2017) introduit un /restore option à la place qui appellera la cible de restauration, puis effacera tous les caches qui ne pouvaient pas être effacés auparavant et exécutera la construction normale comme demandé. Avant la version 15.5, il est préférable de faire deux appels distincts à msbuild.

13
Martin Ullrich