219 votes

Solution de reciblage de .Net 4.0 à 4.5 - comment recibler les paquets NuGet ?

J'ai migré une solution qui cible actuellement .NET 4.0 dans VS2010 vers VS2012 et je voudrais maintenant la recibler sur .Net 4.5.

Ce dont je ne suis pas sûr, ce sont les paquets NuGet. Par exemple, EF5, que j'ai mis à jour depuis EF4 dans VS2010, s'avère être en fait EF 4.4, comme vous pouvez le voir ici :

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

Je peux également voir ce qui suit dans packages.config pour le projet :

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

Donc ma question est :

Quelle est la meilleure pratique pour recibler tous les paquets NuGet qui sont actuellement définis pour cibler .NET 4.0 afin de cibler .NET 4.5 ?

0 votes

277voto

Jeff Handley Points 1907

NuGet 2.1 propose une fonctionnalité qui simplifie grandement les choses : il suffit de faire update-package -reinstall -ignoreDependencies à partir de la console du gestionnaire de paquets.

NuGet 2.0 ne gère pas très bien le reciblage de vos applications. Afin de modifier les frameworks cibles de vos paquets, vous devez désinstaller et réinstaller les paquets (en prenant note des paquets que vous aviez installés afin de pouvoir réinstaller chacun d'entre eux).

La raison pour laquelle les paquets doivent être désinstallés et réinstallés est la suivante :

  • Lors de l'installation d'un paquet, nous déterminons le framework cible de votre projet
  • Nous comparons ensuite ces données avec le contenu du paquet, en trouvant la solution appropriée. \lib\ (et \content\ dossier)
  • Les références d'assemblages sont ajoutées avec des chemins d'accès qui pointent vers les fichiers d'assemblage du paquet. \lib\ avec le bon sous-dossier ( \lib\net40 par exemple)
  • Les fichiers de contenu sont copiés à partir des paquets \content\ avec le bon sous-dossier ( \content\net40 par exemple)
  • Nous enregistrons le targetFramework utilisé pour installer le paquet dans le fichier packages.config
  • Après avoir modifié le cadre cible de votre projet, les chemins d'accès à l'aide indiquent toujours net40.
  • Lorsque vous désinstallez des paquets, nous vérifions le targetFramework qui a été enregistré dans packages.config pour voir quelles libs/contenus du framework cible il faut supprimer de votre projet.
  • Lorsque vous réinstallez le paquet, nous détectons votre cadre cible mis à jour et référençons/copions les librairies/contenus appropriés.

0 votes

En utilisant VS 2012 avec un projet ASP.NET MVC 4, et après avoir reciblé le .NET Framework de 4.0 à 4.5, j'ai exécuté le processus suivant update-package -reinstall dans la console du gestionnaire de paquets. Tous les paquets ont commencé à être désinstallés et mis à jour et tout à coup, Windows 8 a redémarré et quand il est revenu, il a dit "Votre PC a rencontré un problème et a redémarré. Voulez-vous envoyer des informations à Microsoft ?" :( Effrayant... Au fait, c'est la version de NuGet que j'ai installée en ce moment : 2.2.40116.9051 J'ai ouvert un dossier ici : nuget.codeplex.com/workitem/3049

12 votes

L'option -reinstallation n'a jamais fonctionné pour moi. Soit elle supprime les paquets dans le mauvais ordre et provoque des erreurs du type "impossible de supprimer X car Y en dépend", soit elle ne lit pas les paquets. La dernière fois que j'ai essayé, il a supprimé EntityFramework et ne l'a jamais réintroduit.

0 votes

C'est d'ailleurs tout à fait terrible si l'on veut compiler un projet contre les deux CLR2 et CLR4. Vous pouvez faire une copie de votre fichier .csproj, mais votre packages.config doit rester packages.config ...

44voto

vpalmu Points 121

Pour ceux qui ont eu des problèmes avec update-package -reinstall <packagename> envisagez de l'exécuter avec -ignoreDependencies drapeau, comme ceci :

update-package -reinstall <packagename> -ignoreDependencies

Cette option permet de ne pas toucher aux dépendances de votre paquet, sinon elles pourraient être mises à jour même si le paquet que vous vouliez réinstaller à l'origine conserve la même version.

Plus d'informations ici .

0 votes

Merci, ça nous évite bien des soucis. Regarder Nuget essayer de réinstaller la dizaine de dépendances qu'EnterpriseLibrary a tendance à créer, sur plus de 30 projets, allait vers un travail d'une journée. Avec cette solution, il ne s'agit plus que de quelques minutes.

0 votes

Comme d'autres l'ont mentionné, il y a de fortes chances que tout soit cassé.

9 votes

Vous pouvez automatiser cette opération pour l'ensemble de la solution en la modifiant légèrement lors de l'exécution sous la console du gestionnaire de paquets : get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }

23voto

Bo Sunesen Points 731

Après avoir essayé sans succès la réponse acceptée, je voudrais suggérer une commande moins risquée :

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

Pour plus d'informations : http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html

4voto

Craigology Points 161

En tentant de réinstaller les paquets de la solution large, j'ai rencontré une erreur de dépendance (malgré l'utilisation de l'option -ignoreDependencies ), et tous les paquets.config les fichiers de chaque projet avaient été supprimés. Dans VS2013, il semble que paquets.config n'est pas réinjecté sur le disque et ajouté à nouveau tant que toutes les dépendances/références mises à jour ne sont pas rattachées au projet.

Dans mon cas, ce qui a fonctionné, c'est de mettre à niveau chaque projet un par un en ajoutant l'option -ProjectName nom du projet à la update-package commande. Dans ce cas, la paquets.config est mis à jour au fur et à mesure de la mise à niveau de chaque projet.

Cela peut ne pas être pratique pour les très grandes solutions, mais cela semble être un compromis raisonnable pour profiter de la mise à niveau automatisée pour autant de projets que possible et isoler ceux qui posent problème sans avoir chaque paquets.config dans votre solution supprimée en cas d'échec.

2voto

Prabu Arumugam Points 477

Avec Visual Studio pour Mac 2019, un clic droit sur le dossier Packages affiche l'option "Retarget" dans le menu. Cela a résolu le problème de reciblage pour tous les paquets du projet qui nécessitaient un reciblage. Il semble qu'il n'y avait pas de gestionnaire de paquets NuGet dans le menu Outils de Visual Studio pour Mac (du moins dans le mien), je ne pouvais donc pas lancer la console du gestionnaire de paquets.

Retarget menu option under Packages right-click menu

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