9 votes

Fichier NuGet.targets manquant dans un projet existant

Le scénario est le suivant :
1. Création d'une NOUVELLE solution
2. ACTIVER le téléchargement des paquets manquants
3. Ajouter des projets à la solution qui existe déjà et qui dépend des paquets nuget
4. La construction de la solution génère une erreur :

... The missing file is <solution folder>\.nuget\NuGet.targets.

Pourquoi ? Vous avez oublié quelque chose ?

J'utilise Visual Studio 2017 Pro sur Windows 10

Toutes mes recherches répondent au scénario où l'on crée une nouvelle solution et que l'on ajoute un nouveau projet qui dépend d'un package nuget, c'est ok, mais quand on a un projet existant, rien.

11voto

zivkan Points 1279

<solution folder>\.nuget\NuGet.targets est un fichier que l'extension Visual Studio de NuGet ajoutait dans Visual Studio 2010, 2012 et 2013 lorsque vous faisiez un clic droit sur la solution et que vous sélectionniez "Enable NuGet Package Restore". Il ajoute alors une importation dans tous vos fichiers de projet pour importer le fichier de cibles. J'ai récemment été enquêter sur un problème rencontré par un client et, dans le cadre de cette enquête, j'ai constaté qu'il avait apporté les modifications suivantes. Vers le haut du csproj, il ajoute quelque chose comme ceci :

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>

et vers la fin du csproj, il ajoute quelque chose comme ceci :

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

Le problème est donc que vous créez une nouvelle solution, mais que vous utilisez des fichiers de projet existants qui ont été modifiés de cette manière. Une option consiste à éditer vos fichiers csrpoj et à supprimer ces modifications. Une autre option consiste à créer de nouveaux projets, en plus de la nouvelle solution, puis à copier tous vos fichiers de code et de contenu.

Le seul inconvénient est que si vous construisez sur un serveur CI et que vous utilisez packages.config, votre script de construction doit s'exécuter nuget.exe restore alors que les projets qui utilisent NuGet.targets pourraient simplement construire la solution et msbuild exécuterait nuget restore si nécessaire. L'un des avantages de ne plus utiliser NuGet.targets est que la restauration de l'ensemble de la solution est plus rapide que la restauration projet par projet. Visual Studio restaure automatiquement les paquets lors de la construction, même dans VS2010, VS2012 et VS2013, donc personnellement je décourage l'utilisation de cette fonctionnalité, même si vous utilisez ces anciennes versions de Visual Studio. L'avantage de réduire votre script de construction d'une étape ne vaut pas les problèmes qu'elle entraîne, à mon avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X