2013-02-04 13 views
12

Oggi ho riscontrato uno strano comportamento di NuGet durante l'installazione di un pacchetto.In che modo NuGet decide se utilizzare o meno la cache del pacchetto locale?

Una breve descrizione: come risultato del mio script di build c'è un pacchetto NuGet. Non cambio la versione ogni volta, quindi ogni build produce MyPackage.1.0.0.nupkg. Come passaggio finale della build, sposto il pacchetto sul server NuGet distribuito all'interno della rete locale.

Ora su una macchina diversa eseguo nuget install MyPackage -Source http://myserver/nuget, che ovviamente installa il pacchetto NuGet.

Il problema entra in gioco quando invio un altro aggiornamento di MyPackage - ancora della versione 1.0.0. Quando provo a reinstallarlo sul computer client, ottengo la versione precedente del pacchetto.

ho scoperto it is the local cache to be blamed: se il pacchetto è stato installato, si entra nella cache locale e la prossima volta che si installa il pacchetto della stessa versione, è preso dalla cache. Giusto!

Ma, d'altra parte, c'è un'opzione -NoCache del comando nuget install e mi aspetto che ignori la cache locale.

Tuttavia, questo non è vero. La prima volta che lo eseguo con -NoCache, aggiorna la cache e installa la versione più recente. Ma, la prossima volta che il pacchetto è ancora preso dalla cache, anche con l'opzione -NoCache.

È previsto? È a causa della versione non viene modificata?

In caso di necessità: tutte le operazioni NuGet vengono eseguite con NuGet.exe e dalla sessione di PowerShell.

UPDATE: osservo strano comportamento Posso spiegare solo con la scadenza della cache. Quando il pacchetto viene memorizzato nella cache, tutte le chiamate successive a nuget install estraggono il pacchetto dalla cache, fino a quando non passa il tempo. Non ho notato il periodo esatto, ma è sicuramente più di un'ora. Dopo questo, nuget install aggiorna il pacchetto nella cache, e la situazione diventa lo stesso ...

+0

Forse se si include l'-verbosity dettagliato i registri aggiuntivi potrebbero darci qualche suggerimento? – allen

+0

Se aggiungo '-verbosity detailed' alla riga di comando, non emette più informazioni, solo' Installato con successo 'MyPackage.1.0.0'' Sai perché è così? –

+0

Speravo che i registri mostrassero una certa direzione – allen

risposta

10

Yan,

spingo un altro aggiornamento di MyPackage - ancora di versione 1.0.0.

Non si dovrebbe premere più di un pacchetto con una versione particolare: i pacchetti dovrebbero essere immutabili. Se hai modificato qualcosa nel pacchetto, incrementa il numero di build a.b.C e invia una nuova versione del pacchetto.

Il comportamento riscontrato è un effetto collaterale di NuGet che prevede di essere in grado di memorizzare una determinata versione del pacchetto essenzialmente indefinitamente.

+1

Grazie per la risposta! Il motivo per cui non cambio la versione è perché il pacchetto è ancora in sviluppo e viene ricostruito 10 - 20 volte al giorno. Quando "rilascio" il pacchetto inizialmente, voglio comunque che sia 1.0.0. Cosa suggerisci in questo caso? Utilizzando la notazione 0.x.x e/o le strutture di pre-rilascio di NuGet? –

+1

Hi Yan, è possibile incrementare il numero di build "D" sulla confezione: ABCD Ciò consente di mantenere 1.0.0.x dove x potrebbe essere compilato 73. La pre-release è un'altra opzione, ma la semantica è ancora molto in divenire con NuGet, quindi potresti ottenere risultati imprevisti tra diverse versioni di NuGet; Consiglierei di usare il numero di build "D" per ora. –

+3

Raccomando di usare [versioning semantico] (http://semver.org), in particolare la sua nomenclatura di pre-release (ad es .: 'MyPackage.1.0.0-alpha1440.nupkg' o qualcosa del genere). Uno dei vantaggi di questo (oltre ad essere lo standard del settore) è che i feed del pacchetto (come nuget.org) lo capiscono e lo segnalano di conseguenza. Vedi questo [esempio di Antlr] (http://www.nuget.org/packages/Antlr/3.4.1.9004-pre). –

12

Yan,

NuGet memorizza nella cache i pacchetti da cui download sul disco rigido locale. Per la mia macchina Windows 7 la cache si trova in C: \ Users \ jmelosegui \ AppData \ Local \ NuGet \ Cache. Quindi è possibile eliminare il pacchetto nuget che si desidera dimenticare dalla directory della cache locale. Quindi la prossima volta che installerai il pacchetto otterrai l'ultima versione dal server.

BTW: Sono d'accordo con @ matthew-skelton.

Non si dovrebbe premere più di un pacchetto con una versione specifica: i pacchetti dovrebbero essere immutabili. Se hai modificato qualcosa nel pacchetto, incrementa il numero di build a.b.C e invia una nuova versione del pacchetto.

Spero che questo aproach forma nello scenario

+2

Grazie per la tua risposta! Questo è ciò che ho temporaneamente finito - pulire la cache di NuGet in modo "sporco". Ma penso che dovrei studiare il concetto di immutabilità del pacchetto ... –

Problemi correlati