1

J'ai configuré un projet d'application Web avec une étape supplémentaire de post-construction pour compresser certains fichiers résultants en versions de version. Pour ce faire, j'ai ajouté le package MSBuild Community Tasks NuGet. Cela fonctionne correctement lorsque je compile dans Visual Studio et j'ai confirmé que le fichier zip est créé. La partie pertinente du fichier de csproj est:Échec de la génération de projet par programmation en raison d'une tâche de génération tierce

<PropertyGroup> 
    <MSBuildCommunityTasksPath>$(SolutionDir)\.build</MSBuildCommunityTasksPath> 
    <ZipFile>$(SolutionName).zip</ZipFile> 
</PropertyGroup> 
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.targets" /> 

<Target Name="Zip" AfterTargets="Build" Condition="'$(Configuration)' == 'Release'"> 
    <ItemGroup> 
     <ZipFiles Include="$(ProjectDir)\*.js; $(ProjectDir)\manifest.json" Exclude="$(ProjectDir)\*.map.js" /> 
    </ItemGroup> 
    <Delete Files="$(ZipFile)" /> 
    <Zip Files="@(ZipFiles)" WorkingDirectory="$(ProjectDir)" ZipFileName="$(ZipFile)" ZipLevel="9" /> 
</Target> 

J'ai un code dans un autre projet qui tente de construire automatiquement le projet ci-dessus. Voici le code:

var projectInstance = new ProjectInstance(project.File.AbsolutePath); 
projectInstance.SetProperty("Configuration", "Release"); 
projectInstance.SetProperty("SolutionDir", project.Solution.Directory.AbsolutePath); 

projectInstance.Build("Build", Enumerable.Empty<ILogger>()); 

Le code ci-dessus échoue avec le message d'erreur suivant:

La tâche "Zip" n'a pas été trouvé. Vérifiez les points suivants: 1.) Le nom de la tâche dans le fichier de projet est le même que le nom de la classe de tâche. 2.) La classe de tâche est "public" et implémente l'interface Microsoft.Build.Framework.ITask. 3.) La tâche est correctement déclarée dans le fichier de projet ou dans les fichiers * .tasks situés dans le répertoire "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319".

Si je supprime la tâche Zip, cela fonctionne parfaitement. Pourquoi cela échoue-t-il lorsque je crée par programmation, mais pas quand je construis dans VS? Comment puis-je le réparer?

+0

Avez-vous essayé la même chose à partir de l'invite de commande Visual Studio, en utilisant la commande msbuild'. Si non, pouvez-vous l'essayer une fois et afficher le résultat? – RinoTom

+0

@RinoTom, j'ai juste essayé ça, et ça a produit le même résultat. Il comportait également un numéro d'erreur: * erreur MSB4036 *. – Sam

Répondre

-1

Cela sera résolu si vous donnez l'option package de restauration des outils de Visual Studio Menu >> Options >> Package Manager >> Général comme indiqué dans l'image ci-dessous:

Enable Package Restore

Cela permettra de restaurer la Nuget packages même lorsque vous construisez le projet en utilisant MSBuild. Sinon, il ne restaurera que dans les versions Visual Studio et non dans les versions MSBuild. Par conséquent MSBuild.Community.Tasks Nuget n'a pas été restauré pour vous dans MSBuild mais se passe bien dans Visual Studio. Donc, essayez ceci et j'espère que cela devrait résoudre le problème.

+0

Le paquet n'est pas manquant, donc je ne pense pas qu'il ait besoin de restauration; c'est déjà dans le système de fichiers. MSBuild ne dit pas qu'il ne peut pas trouver le fichier. – Sam

+0

Voulez-vous dire que les fichiers de package sont présents dans le système de fichiers après une tentative sur l'invite de commande Visual Studio MSBuild et/ou une compilation programmatique? Je sais qu'il sera présent même après une construction Visual Studio même sans le paramètre que j'ai mentionné dans la réponse. – RinoTom

+0

C'est vrai; J'ai déjà installé le paquet de NuGet avant de mettre à jour le fichier de projet. Je ne l'ai pas supprimé du système de fichiers. – Sam

Questions connexes