Ripristino dei riferimenti Nuget?


182

Ho una soluzione e un progetto in Visual Studio 2012.

Il progetto ha un file packages.confignella radice del progetto.

Ai fini di questa domanda, supponiamo che abbia rimosso per errore queste librerie dalla Referencessezione del mio progetto.

Quando si accede a Gestione pacchetti NuGet, l'interfaccia sta ancora segnalando un segno di spunta accanto a questi pacchetti, indicando che sono installati.

L'unico modo in cui posso vedere come risolvere questa situazione è eliminare tutte le voci da packages.config, che risolverà il problema dell'interfaccia NuGet segnalandole come installate e aggiungerle nuovamente.

C'è un modo più intelligente? Speravo che abilitare "abilita nuget per ripristinare i pacchetti mancanti" avrebbe risolto questo problema, ma sembra che non faccia nulla.

Risposte:


329

Prova a reinstallare i pacchetti .

Nella console di Gestione pacchetti NuGet immettere il comando seguente:

Update-Package -Reinstall -ProjectName Your.Project.Name

Se si desidera reinstallare i pacchetti e ripristinare i riferimenti per l'intera soluzione, omettere il -ProjectNameparametro.


10
Traduzione inglese del link: translate.google.com/…
Csaba Toth,

18
Nota: questo comando reinstalla i riferimenti su tutti i progetti attualmente aperti in Visual Studio, anziché solo il progetto selezionato nella console.
simbolo

3
Questo comando reinstallerà i pacchetti nell'intera soluzione, non solo in un progetto selezionato!
Alex Sorokoletov,

14
Estremamente pericoloso !!!! Se il processo viene interrotto, perderai tutti i riferimenti del pacchetto e dovrai aggiungerne uno per uno a ogni progetto della tua soluzione.
Bill Velasquez,

2
@BillVelasquez questa cosa ha appena mangiato tutti i miei riferimenti. Bene, grazie a dio per git, immagino.
Gleno,


13

Nel caso questo aiuti qualcuno, per me, nessuna delle precedenti era sufficiente. Non riuscivo ancora a costruire, VS non riusciva ancora a trovare i riferimenti. La chiave era semplicemente chiudere e riaprire la soluzione dopo aver ripristinato i pacchetti.

Ecco lo scenario (usando Visual Studio 2012):

Si apre una soluzione con pacchetti mancanti. I riferimenti mostrano che VS non riesce a trovarli. Esistono molti modi per ripristinare i pacchetti mancanti, incluso

  • creazione di una soluzione impostata per il ripristino automatico
  • aprendo la console di gestione pacchetti e facendo clic sul pulsante "Ripristina"
  • facendo nuget restorese hai installato il nuget da riga di comando

Ma qualunque sia l'approccio, quei riferimenti verranno comunque mostrati mancanti. E quando lo costruisci fallirà. Sospiro. Tuttavia, se chiudi la soluzione e la riapri, ora VS controlla di nuovo quei bei messaggi <HintPath>, scopre che i pacchetti sono tornati dove appartengono e tutto va bene per il mondo.

Aggiornare

Visual Studio continua a non vedere di avere il pacchetto? Stai ancora mostrando un riferimento che non può risolvere? Assicurarsi che la versione del pacchetto ripristinato sia esattamente la stessa del <HintPath>file .csproj. Anche un numero minore di correzione di bug (ad es. Da 1.10.1 a 1.10.2) causerà il fallimento del riferimento. Puoi risolvere questo problema modificando direttamente il tuo csproj xml, oppure rimuovendo il riferimento e creandone uno nuovo che punta alla versione appena ripristinata nella directory dei pacchetti.


1
Fai un punto molto importante sul ripristino solo assicurandoti che i pacchetti si trovino nella cartella dei pacchetti (che ovviamente può essere in molti punti). Tuttavia la chiusura e la riapertura non funzionavano ancora per me anche con le versioni del pacchetto corrette, alla fine ho dovuto modificare manualmente i percorsi dei suggerimenti in ogni file csproj. Credo che ciò sia causato dallo spostamento della cartella del pacchetto rispetto al progetto.
Shaun,

La modifica del .csprojfile per assicurarsi che i numeri di versione abbinati funzionassero per me. Grazie!
Mateen Ulhaq,

11

Mentre la soluzione fornita da @jmfenoll funziona, si aggiorna agli ultimi pacchetti. Nel mio caso, avendo installato beta2 (pre-release) ha aggiornato tutte le librerie su RC1 (che aveva un bug). Pertanto la soluzione di cui sopra fa solo metà del lavoro.

Se ti trovi nella stessa situazione in cui mi trovo e desideri sincronizzare il tuo progetto con la versione esatta dei pacchetti NuGet che hai / o specificato nel tuo packages.config, allora questo script potrebbe aiutarti. Basta copiarlo e incollarlo nella console di Package Manager

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

E quindi eseguirlo con un nome pacchetto settico come

Sync-References AutoMapper

o per tutti i pacchetti simili

Sync-References

I crediti vanno a Dan Haywood e al suo post sul blog .


8

Il seguente script può essere eseguito nella finestra Console gestore pacchetti e rimuoverà tutti i pacchetti da ciascun progetto nella soluzione prima di reinstallarli.

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

Ciò eseguirà di nuovo lo script di installazione di ogni pacchetto, il che dovrebbe ripristinare i riferimenti di assembly mancanti. Sfortunatamente, tutte le altre cose che possono fare gli script di installazione - come la creazione di file e la modifica di configurazioni - accadranno di nuovo. Probabilmente vorrai iniziare con una copia di lavoro pulita e utilizzare lo strumento SCM per selezionare e scegliere quali modifiche nel progetto conservare e quali ignorare.


3

Ho aggiunto manualmente le DLL. Fare clic con il tasto destro su Riferimenti nel progetto, selezionare Aggiungi riferimento e quindi nella finestra di dialogo premere il pulsante Sfoglia. Le DLL NuGet nella directory dei pacchetti della soluzione. Per ottenerne i nomi, è possibile fare clic con il pulsante destro del mouse sui riferimenti in un altro progetto che funziona correttamente e selezionare le proprietà e cercare nella proprietà path.


Questa è la soluzione più semplice. Funziona per me semplicemente sfogliando la cartella dei pacchetti.
Hao Nguyen,

2

In Visual Studio 2015 (Soulution è sotto il controllo del codice sorgente, MVC-Project), csano ha Update-Package -Reinstall -ProjectName Your.Project.Namefunzionato, ma ha incasinato alcuni blocchi di scrittura.

Prima ho dovuto cancellare manualmente la "cartella" dei pacchetti. (Sembrava bloccato a causa del controllo del codice sorgente).

Inoltre, ho dovuto reinstallare il pacchetto MVC da NuGet Package Manager.


2

Questo script reinstallerà tutti i pacchetti di un progetto senza incasinare dipendenze o installare dipendenze che potrebbero essere state rimosse intenzionalmente. (Altro per gli sviluppatori di pacchetti di parti.)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies

1

Nel caso in cui aiuti qualcuno - Nel mio scenario, ho alcune librerie condivise (che hanno i loro progetti / soluzioni TFS) tutte combinate in un'unica soluzione.

Nuget ripristinava correttamente i progetti, ma mancava la DLL.

Il problema di fondo era che, mentre la tua soluzione ha la sua cartella dei pacchetti e li ha ripristinati correttamente in quella cartella, il file di progetto (ad esempio .csproj) fa riferimento a un altro progetto che potrebbe non aver scaricato il pacchetto. Apri il file in un editor di testo per vedere da dove provengono i tuoi riferimenti.

Ciò può verificarsi quando si gestiscono pacchetti su diverse soluzioni condivise interconnesse, poiché probabilmente si desidera assicurarsi che tutte le DLL siano allo stesso livello, è possibile impostarlo al livello superiore. Ciò significa che a volte cercherà in una soluzione completamente diversa per una DLL di riferimento e quindi se non hai tutti i progetti / soluzioni scaricati e aggiornati, potresti avere il problema sopra.


1

Sono d'accordo con @Juri sul fatto che la risposta molto popolare di jmfenoll non sia completa. Nel caso di riferimenti interrotti, sostengo che la maggior parte delle volte non si desidera aggiornare all'ultimo pacchetto, ma correggere i riferimenti solo alle versioni correnti che si sta utilizzando. E Juri ha fornito una comoda funzione Sync-Referencesper fare proprio questo.

Ma possiamo andare un po 'oltre, consentendo la flessibilità di filtrare per progetto e pacchetto:

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}

1

Ho avuto lo stesso problema con riferimenti mancanti. Di seguito il mio scenario:

  • Nuova macchina Windows 10 e installazione VS Community 2015
  • Ho appena verificato il codice del repository tramite TFS
  • Una soluzione costruita bene, una soluzione aveva un progetto con riferimenti mancanti (EF, System.Http, come esempio), ma i relativi pacchetti nuget sono stati installati correttamente.

Tutti i numeri di versione nel progetto e nei pacchetti corrispondono, il ripristino di nuget (in tutti i suoi modi) non ha funzionato.

Come l'ho risolto: è sufficiente eliminare le cartelle dei pacchetti nella radice della soluzione ed eseguire il ripristino di nuget. A questo punto le DLL sono scaricate correttamente e possono essere aggiunte per i riferimenti mancanti.



0
  1. Copia il file package.config del progetto e applica tutte le modifiche alla versione
  2. Disinstallare tutto il pacchetto e rimuovere le dipendenze

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Cancella la cartella dei pacchetti nella radice del progetto

  4. Copia il pacchetto package.config modificato nella cartella principale del sito Web

  5. Esegui questo codice per ripristinare il progetto

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    
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.