Soluzione di retargeting da .Net 4.0 a 4.5: come effettuare il retarget dei pacchetti NuGet?


205

Ho migrato una soluzione che sta attualmente prendendo di mira .NET 4.0 in VS2010 in VS2012 e ora vorrei ridisegnarla a .Net 4.5

Ciò di cui non sono sicuro sono i pacchetti NuGet. Ad esempio EF5, che ho aggiornato da EF4 in VS2010, risulta essere effettivamente EF 4.4, come puoi vedere qui:

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

Posso anche vedere quanto segue in packages.config per il progetto:

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

Quindi la mia domanda è:

Qual è la migliore pratica per indirizzare nuovamente tutti i pacchetti NuGet che sono attualmente impostati su target .NET 4.0 per target .NET 4.5?


Risposte:


266

NuGet 2.1 offre una funzionalità che rende tutto molto più semplice: basta farlo update-package -reinstall -ignoreDependenciesdalla console di Package Manager.

NuGet 2.0 non gestisce molto bene il targeting delle tue applicazioni. Per modificare i framework di destinazione dei pacchetti, è necessario disinstallare e reinstallare i pacchetti (prendendo nota dei pacchetti installati in modo da poter reinstallare ciascuno di essi).

Il motivo per cui i pacchetti devono essere disinstallati e reinstallati è:

  • Durante l'installazione di un pacchetto, determiniamo il framework di destinazione del tuo progetto
  • Quindi lo abbiniamo al contenuto del pacchetto, trovando la cartella \ lib \ appropriata (e la cartella \ content \)
  • I riferimenti all'assembly vengono aggiunti con Percorsi suggerimento che puntano alla cartella \ lib \ del pacchetto, con la sottocartella giusta (ad esempio \ lib \ net40)
  • I file di contenuto vengono copiati dalla cartella pacchetti \ content \, con la sottocartella giusta (ad esempio \ content \ net40)
  • Registriamo targetFramework utilizzato per installare il pacchetto all'interno del file packages.config
  • Dopo aver modificato il framework di destinazione del progetto, i Suggerimenti suggeriscono ancora net40
  • Quando disinstalli i pacchetti, controlliamo il targetFramework che è stato registrato in pacchetti.config per vedere quali librerie / contenuti del framework di destinazione rimuovere dal tuo progetto
  • Quando reinstalli il pacchetto, rileviamo il tuo framework di destinazione aggiornato e facciamo riferimento / copiamo le librerie / i contenuti corretti

Usando VS 2012 con un progetto ASP.NET MVC 4 e dopo aver reindirizzato .NET Framework dalla 4.0 alla 4.5, ho eseguito update-package -reinstallnella console di Package Manager. Tutti i pacchetti hanno iniziato a essere disinstallati e aggiornati e all'improvviso Windows 8 è stato riavviato e quando è tornato ha detto "Il tuo PC ha riscontrato un problema e si è riavviato. Vuoi inviare informazioni a Microsoft?" :( Spaventando ... A proposito, questa è la versione NuGet che ho installato in questo momento: ha 2.2.40116.9051aperto un problema qui: nuget.codeplex.com/workitem/3049
Leniel Maccaferri,

12
le opzioni -reinstall non hanno mai funzionato una volta per me. O rimuove nell'ordine sbagliato ed errori su "impossibile rimuovere X perché Y dipende da esso" o talvolta non legge i pacchetti. L'ultima volta che l'ho provato, ha rimosso EntityFramework e non lo ha mai aggiunto di nuovo.
CodingWithSpike

4
update-package -reinstall non era una soluzione per me. Ha anche aggiornato molti pacchetti, piuttosto che lasciarli sulle versioni che usiamo e su cui abbiamo provato. Ad esempio, Ninject è stato spostato su v3 e questo è un cambio di versione non funzionante.
Steve Owen,

13
Non tentare nemmeno di aggiornare-page -reinstall. Questa cosa è stata un tale casino quando è stata eseguita sul mio computer locale che ho dovuto fermare ulteriormente il gestore di pacchetti NuGet. Ha rimosso la mia versione di jQuery 1.10 e lo ha sostituito con 1.4.4 per qualche motivo. Fallo manualmente e risparmia il fastidio.
JustinMichaels,

2
Sono d'accordo con il disastro, e sono passati anche due anni da questo post. Ha trovato versioni inferiori di alcune pepite e ha rovinato molti riferimenti. E questo è stato dopo quasi due ore di aggiornamento (su una workstation di fascia alta dall'inizio del 2014). 20 progetti nella soluzione.
Arve Systad,

42

Per coloro che hanno avuto problemi con il update-package -reinstall <packagename>comando, considera di eseguirlo con -ignoreDependenciesflag, in questo modo:

update-package -reinstall <packagename> -ignoreDependencies

Questo flag lascerà da sole le dipendenze dei pacchetti, altrimenti potrebbero essere aggiornati anche se il pacchetto che volevi reinstallare reinstallare mantiene ancora la stessa versione.

Maggiori informazioni qui .


Grazie, questo fa davvero risparmiare un sacco di problemi. Guardare Nuget che cercava di reinstallare le circa 10 dipendenze che EnterpriseLibrary tende a creare, su oltre 30 progetti, si stava dirigendo verso un lavoro di una giornata. Questo lo porta in pochi minuti.
David Keaveny,

Come altri hanno già detto, molto probabilmente romperà tutto.
Gleno,

9
Puoi automatizzarlo per l'intera soluzione cambiandolo leggermente durante l'esecuzione nella Console Gestione pacchetti:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@KalebPederson Nella mia esperienza il comando funziona a livello di soluzione?

1
@ BjörnAliGöransson - Scusa se non sono stato abbastanza chiaro. La risposta fornisce un modo per aggiornare un singolo pacchetto attraverso la soluzione. Il mio script esaminerà tutti i pacchetti NuGet nella soluzione e lo riproporrà su tutta la soluzione. La risposta è perfetta per un singolo progetto, ma lo script che ho fornito potrebbe essere migliore se hai molti pacchetti che devono essere sottoposti a retargeting.
Kaleb Pederson,


4

Durante il tentativo di reinstallare i pacchetti a livello di soluzione, ho riscontrato un errore di dipendenza (nonostante l'utilizzo della -ignoreDependenciesbandiera) e tutti i file packages.config per ogni progetto sono stati eliminati. In VS2013, sembra che pacchetti.config non venga ripristinato sul disco e aggiunto di nuovo fino a quando tutte le dipendenze / i riferimenti aggiornati non vengono ricollegati al progetto.

Nel mio caso ciò che ha funzionato è stato quello di aggiornare ogni progetto one-at-a-time aggiungendo il -ProjectName nomeprogetto al update-packagecomando. In questo caso, package.config viene aggiornato man mano che ciascun progetto viene aggiornato.

Potrebbe non essere pratico per soluzioni molto grandi, ma sembra un ragionevole compromesso sfruttare ancora l'aggiornamento automatico per il maggior numero possibile di progetti e isolare quelli problematici senza che tutti i pacchetti.config nella soluzione vengano eliminati in caso di errore.


3
Ho riscontrato lo stesso problema. UpdatePackage -Reinstallcancellato il package.config e i riferimenti al progetto per alcuni progetti (in particolare quelli che avevano generato falsi assembly in essi). Abbiamo risolto il problema annullando tutte le modifiche al progetto incasinato ed eseguendo:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Con Visual Studio per Mac 2019, facendo clic con il pulsante destro del mouse sulla cartella Pacchetti, viene visualizzata l'opzione "Retarget" nel menu. Ciò ha risolto il problema di retarget per tutti i pacchetti nel progetto che richiedevano il retargeting. Sembra che non ci fosse NuGet Package Manager nel menu Strumenti di Visual Studio per Mac (almeno nel mio), quindi non ho potuto avviare la Console di Package Manager.

Opzione di menu Retarget nel menu di scelta rapida Pacchetti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.