Reinstallare e aggiornare i pacchetti NuGet in Visual Studio

In alcuni casi i riferimenti ai pacchetti possono interrompersi all'interno di un progetto di Visual Studio. La disinstallazione e la reinstallazione della stessa versione del pacchetto spesso ripristinano i riferimenti all'ordine di lavoro. L'aggiornamento di un pacchetto, che installa una versione aggiornata, può anche risolvere il problema. Questo articolo descrive come reinstallare e aggiornare i pacchetti NuGet per risolvere i riferimenti ai pacchetti interrotti e i progetti interrotti.

Nota

Le indicazioni contenute in questo articolo si applicano solo ai progetti che usano il formato di gestione packages.config . Per i progetti PackageReference , un'operazione di ripristino corregge automaticamente i riferimenti interrotti.

Scenari comuni

Ecco alcuni scenari comuni in cui possono verificarsi riferimenti a pacchetti interrotti nel progetto di Visual Studio.

Scenario Descrizione Risoluzione
Riferimenti interrotti dopo il ripristino del pacchetto Si apre il progetto di Visual Studio e si ripristinano i pacchetti NuGet, ma i riferimenti ai pacchetti interrotti rimangono. Per correggere i riferimenti, provare a reinstallare ogni pacchetto separatamente.
Progetto interrotto a causa di file eliminati I file di pacchetto eliminati (mancanti) causano l'interruzione del progetto. NuGet non impedisce l'eliminazione di elementi aggiunti dai pacchetti. Può essere facile modificare inavvertitamente il contenuto installato da un pacchetto e interrompere il progetto. Per ripristinare il progetto, provare a reinstallare i pacchetti interessati.
Progetto interrotto dopo l'aggiornamento del pacchetto Un aggiornamento del pacchetto interrompe il progetto. Gli aggiornamenti complementari a un pacchetto di dipendenza in genere causano questo tipo di errore. Per ripristinare lo stato della dipendenza nell'ordine di lavoro precedente, provare a reinstallare il pacchetto dipendente specifico.
Riferimenti interrotti dopo il retarget o l'aggiornamento del progetto Un processo di ridefinizione o aggiornamento del progetto causa riferimenti a pacchetti interrotti. Dopo la ridefinizione del progetto, NuGet visualizza un errore di compilazione. Gli avvisi di compilazione elencano i pacchetti che potrebbero essere necessari per essere reinstallati. In alternativa, dopo l'aggiornamento del progetto, NuGet visualizza un errore nel log di aggiornamento del progetto. Il file di log elenca i pacchetti che potrebbero essere necessari per essere reinstallati. Per risolvere i problemi causati da una modifica nel framework di destinazione, provare a reinstallare uno o più pacchetti.
Modifiche dei pacchetti in fase di sviluppo Gli autori di pacchetti spesso devono reinstallare la stessa versione di un pacchetto che stanno sviluppando per testare le modifiche. La console di Gestione pacchetti NuGet in Visual Studio offre opzioni flessibili per l'aggiornamento e la reinstallazione dei pacchetti. Per reinstallare un pacchetto in fase di sviluppo, è possibile usare il Update-Package -reinstall comando .

Opzioni di implementazione

Sono disponibili diverse opzioni per aggiornare e reinstallare i pacchetti NuGet. I metodi comuni includono le opzioni dell'interfaccia utente di NuGet Gestione pacchetti, la console Gestione pacchetti NuGet e l'interfaccia della riga di comando di NuGet (interfaccia della riga di comando).

Interfaccia utente di Gestione pacchetti

Oltre all'interfaccia console, l'interfaccia utente Gestione pacchetti offre anche opzioni di menu per installare, aggiornare e disinstallare i pacchetti.

  • Per aggiornare un pacchetto, aprire la scheda Aggiornamenti, scegliere uno o più pacchetti e quindi selezionare Aggiorna.

  • Per reinstallare un pacchetto, disinstallare prima il pacchetto e quindi installarlo di nuovo. Aprire la scheda Installato , scegliere un pacchetto e registrarne il nome, quindi selezionare Disinstalla. Passare alla scheda Sfoglia e cercare il nome del pacchetto, scegliere il pacchetto e quindi selezionare Installa.

Console di gestione pacchetti

È possibile accedere alla console di Gestione pacchetti in Strumenti>Gestione pacchetti> Gestione pacchetti Console.

  • Per aggiornare un pacchetto, la console di Gestione pacchetti fornisce il Update-Package comando .

  • Per reinstallare un pacchetto, è possibile usare lo stesso comando con il -reinstall parametro . Questo approccio è l'opzione più semplice, se è compatibile con la configurazione.

Per altre informazioni, vedere le sezioni Considerazioni relative al comando Update-Package e Alla reinstallazione del pacchetto.

Interfaccia della riga di comando di NuGet

L'interfaccia della riga di comando di NuGet, nuget.exe, è l'utilità della riga di comando per Windows che fornisce tutte le funzionalità di NuGet.

  • Per aggiornare un pacchetto installato, eseguire il nuget update comando .

  • Per reinstallare tutti i pacchetti NuGet, eliminare la cartella del pacchetto e quindi eseguire il nuget install comando .

  • Per reinstallare un singolo pacchetto, eliminare la cartella del pacchetto e quindi eseguire il nuget install <id> comando, dove l'argomento è l'ID <id> del pacchetto specifico.

Nota

Per l'interfaccia della riga di comando dotnet, la procedura equivalente non è necessaria. Quando si esegue il dotnet restore comando, l'interfaccia della riga di comando dotnet usa NuGet per determinare le dipendenze e scaricare i pacchetti NuGet necessari. Per altre informazioni, vedere Ripristinare pacchetti NuGet con l'interfaccia della riga di comando dotnet.

Vincoli per le versioni di aggiornamento

Per impostazione predefinita, la reinstallazione o l'aggiornamento di un pacchetto installa sempre la versione più recente disponibile dall'origine del pacchetto. Tuttavia, i progetti che usano il packages.config formato di gestione possono limitare in modo specifico l'intervallo di versioni del pacchetto NuGet consentito.

Si supponga che l'applicazione funzioni solo con la versione 1.x di un pacchetto, ma non con la versione 2.0 o successiva, a causa di una modifica importante nell'API del pacchetto. Per assicurarsi che l'applicazione funzioni come previsto, è consigliabile vincolare gli aggiornamenti dei pacchetti NuGet solo alle versioni 1.x. La limitazione consente di evitare aggiornamenti accidentali che potrebbero interrompere l'applicazione.

Per impostare un vincolo, aprire il packages.config file in un editor di testo. Individuare la dipendenza da limitare e aggiungere l'attributo con l'intervallo allowedVersions di versioni desiderato.

L'esempio seguente illustra come vincolare gli aggiornamenti alla versione 1.x impostando l'attributo allowedVersions su [1,2):

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="ExamplePackage" version="1.1.0" allowedVersions="[1,2)" />

    <!-- ... -->
</packages>

In tutti i casi, usare la notazione descritta in Controllo delle versioni dei pacchetti.

Comando Update-Package

Il comando Update-Package nella console di Gestione pacchetti è il modo più semplice per reinstallare un pacchetto e risolvere i riferimenti interrotti. Tuttavia, questo approccio non è utilizzabile in tutti gli scenari. È possibile usare il comando per aggiornare un pacchetto installato, ma non per eseguire un'installazione iniziale. Se si tenta di aggiornare o reinstallare un pacchetto che non è già installato nella configurazione, il comando restituisce un errore. Assicurarsi di esaminare la sezione Considerazioni sulla reinstallazione del pacchetto prima di usare il comando .

L'aggiornamento dei pacchetti in un progetto o una soluzione tramite PackageReference viene sempre aggiornato alla versione più recente del pacchetto (esclusi i pacchetti non definitive). I progetti che usano il packages.config formato di gestione possono limitare le versioni di aggiornamento, come descritto in Vincoli per le versioni di aggiornamento.

Le sezioni seguenti forniscono esempi per l'uso del comando .

Reinstallare le opzioni del pacchetto

Ecco un utilizzo di base del comando per eseguire una reinstallazione. Per identificare un pacchetto NuGet specifico, è possibile usare il parametro facoltativo -Id .

# Reinstall the package named <package_name>
Update-Package -Id <package_name> –reinstall

L'uso del Update-Package comando è più semplice rispetto alla rimozione di un pacchetto e quindi al tentativo di individuare lo stesso pacchetto nella raccolta NuGet con la stessa versione.

Aggiornare le opzioni del pacchetto

Lo stesso comando senza il -reinstall parametro aggiorna un pacchetto a una versione più recente, se applicabile. Il comando restituisce un errore se il pacchetto specificato non è già installato in un progetto.

# Update the package named <package_name>
Update-Package <package_name>

Opzioni di progetto e soluzione

Per impostazione predefinita, il Update-Package comando influisce su tutti i progetti in una soluzione. Per limitare l'azione a un progetto specifico, usare il -ProjectName parametro . Specificare il nome del progetto visualizzato in Visual Studio Esplora soluzioni.

Il comando seguente reinstalla un pacchetto NuGet per un progetto specifico nella soluzione. Il nome del pacchetto NuGet specifico da reinstallare viene fornito nel <package_name> parametro .

# Reinstall the package named <package_name> in MyProject only
Update-Package <package_name> -ProjectName MyProject -reinstall

Se si desidera reinstallare tutti i pacchetti nel progetto, usare il -ProjectName parametro non specificando alcun pacchetto specifico. È possibile seguire questo stesso approccio per aggiornare i pacchetti nel progetto, come illustrato in questo esempio:

# Update all packages in MyProject only
Update-Package -ProjectName MyProject

Per aggiornare tutti i pacchetti in una soluzione, usare il Update-Package comando da solo senza altri argomenti o parametri.

Importante

Assicurarsi di usare attentamente il formato seguente del comando. Il processo di comando può richiedere molto tempo per eseguire tutti gli aggiornamenti.

# Update all packages in all projects in the solution
Update-Package 

Considerazioni sulla reinstallazione dei pacchetti

Se si intende usare il Update-Package comando per reinstallare i pacchetti, esaminare le considerazioni seguenti per garantire la compatibilità con lo scenario di configurazione.

  • I pacchetti e le relative dipendenze potrebbero non supportare un framework di destinazione del progetto retargetto.
  • Quando l'attributo requireReinstallation è impostato su true, Visual Studio genera avvisi di compilazione per i pacchetti interessati.
  • La reinstallazione di un pacchetto e dei vincoli di versione può introdurre problemi di compatibilità delle versioni delle dipendenze.
  • La reinstallazione di un pacchetto specifico può causare l'interruzione dei pacchetti dipendenti.

Il pacchetto non supporta il framework di destinazione del progetto

Se si ridestina il framework di destinazione del progetto, uno o più pacchetti potrebbero non supportare la nuova configurazione di destinazione.

In genere, la reinstallazione di un pacchetto con il Update-Package –reinstall <package_name> comando funziona. Un pacchetto installato in un framework di destinazione precedente viene disinstallato e lo stesso pacchetto viene installato nel nuovo framework di destinazione del progetto.

In alcuni casi, un pacchetto potrebbe non supportare il nuovo framework di destinazione. Ecco alcuni dei problemi che potrebbero verificarsi:

  • Se un pacchetto supporta librerie di classi portabili e si esegue il retargeting del progetto in una combinazione di piattaforme non più supportate dal pacchetto, i riferimenti al pacchetto possono essere mancanti dopo la reinstallazione.

  • Questo problema può verificarsi per i pacchetti usati direttamente o per i pacchetti installati come dipendenze. Qualsiasi pacchetto usato direttamente potrebbe supportare il nuovo framework di destinazione, mentre le relative dipendenze non lo sono.

  • Se la reinstallazione dei pacchetti dopo la ridestinazione dell'applicazione genera errori di compilazione o runtime, potrebbe essere necessario ripristinare il framework di destinazione o cercare pacchetti alternativi che supportano correttamente il nuovo framework di destinazione.

Attributo requireReinstallation impostato su true

Dopo aver ridestinato il framework di destinazione del progetto o aver aggiornato i pacchetti NuGet, NuGet potrebbe aggiungere l'attributo requireReinstallation al file per il packages.config progetto. Se NuGet rileva i pacchetti interessati durante il processo di reindirizzamento o aggiornamento, aggiunge un requireReinstallation="true" attributo al packages.config file per tutti i riferimenti al pacchetto interessati. Di conseguenza, ogni compilazione successiva del progetto in Visual Studio genera avvisi di compilazione per tali pacchetti. Gli avvisi vengono visualizzati come promemoria per reinstallare il pacchetto interessato.

Incompatibilità della versione delle dipendenze del pacchetto

Il Update-Package –reinstall comando reinstalla la stessa versione di un pacchetto installato e la versione più recente di tutte le dipendenze. Per risolvere i problemi di incompatibilità delle versioni, è possibile impostare vincoli di intervallo di versioni per controllare la configurazione. NuGet rispetta i vincoli e aggiorna le dipendenze del pacchetto alle versioni più recenti solo se necessario per risolvere un problema.

  • Se le impostazioni dei vincoli causano il ripristino di una versione precedente durante la reinstallazione del pacchetto, è possibile risolvere il problema con il Update-Package <dependency_name> comando . Questo comando reinstalla la dipendenza specificata senza influire sul pacchetto dipendente.

  • È anche possibile usare il comando Update-Package –reinstall <packageName> -ignoreDependencies. Questa opzione reinstalla la stessa versione del pacchetto originale, ma non reinstalla le dipendenze. Usare questo approccio quando si aggiornano le dipendenze del pacchetto potrebbe verificarsi uno stato di configurazione interrotto.

Pacchetto dipendente interrotto

Quando si reinstalla un pacchetto specifico, tutti i pacchetti installati che dipendono dal pacchetto reinstallato non vengono aggiornati. Le versioni di questi altri pacchetti installati rimangono invariate. Di conseguenza, la reinstallazione di una dipendenza può interrompere un pacchetto dipendente.