Archiviazione dei pacchetti da NuGet nel controllo della versione?


87

Prima di NuGet, era comunemente accettata la "best practice" per archiviare tutte le DLL esterne usate in un progetto. In genere in una directory Libso 3rdParty.

Quando si lavora con NuGet, è necessario archiviare la packagesdirectory o esiste un modo per MSBuild di scaricare automaticamente i pacchetti necessari dal feed nuget?


2
La risposta a questa domanda è una questione di opinione. Il campo "exclude / No" sostiene che, poiché il set di funzionalità fornito rende facile durante lo sviluppo e la compilazione di estrarre semplicemente dal repository del pacchetto (ad esempio nuget.org), può essere fatto solo in fase di compilazione. Il campo "include / Yes" sostiene che il codice non verrebbe compilato senza i pacchetti se il repository esterno non fosse disponibile. Leggi entrambi i lati prima di prendere una decisione. Vedi anche: softwareengineering.stackexchange.com/questions/301547/…
CJBS

Risposte:


68

No

Poiché è stata posta questa domanda, ora è disponibile un flusso di lavoro semplice per usare NuGet senza impegnare i pacchetti nel controllo del codice sorgente

Dalla console del gestore di pacchetti è necessario installare "NuGetPowerTools" :

Install-Package NuGetPowerTools

Quindi, per abilitare i tuoi progetti a supportare il ripristino del pacchetto, devi eseguire un altro comando:

Enable-PackageRestore

Ora sei pronto per eseguire il commit della tua base di codice senza la cartella dei pacchetti. Il comando precedente ha modificato i file di progetto in modo che, se mancano dei pacchetti, vengono automaticamente scaricati e aggiunti.

fonte

Uso di NuGet senza eseguire il commit dei pacchetti nel controllo del codice sorgente


41
A partire da NuGet-1.6, non è più necessario NuGetPowerTools per eseguire questa operazione. È sufficiente fare clic destro sulla soluzione in Solution Explorer e selezionare, Enable NuGet Package Restore. Vedi i documenti .
Kaleb Pederson,

3
Sì, devi controllare nella cartella .nuget e nei file sottostanti.
assenza il

11
@Edward - Filosoficamente, perché non includere i pacchetti NuGet nel controllo del codice sorgente dato che sono dipendenze? Ciò che è archiviato nel controllo del codice sorgente dovrebbe essere al 100% del codice sufficiente per una build. Non includendo i pacchetti NuGet vengono create dipendenze esterne, ad es. cosa succede se il percorso di download del pacchetto cambia, o per qualche strana ragione non è più disponibile, ecc. O più probabilmente cosa succede se c'è qualche piccola modifica al pacchetto che viene successivamente scaricato nuovamente e interrompe la build? Ciò sarebbe stato evitato se tutto il necessario per creare il progetto fosse nel controllo del codice sorgente.
Howiecamp

5
@Howiecamp non potrei essere più d'accordo. Non capisco la logica. Voglio che il controllo del codice sorgente sia un sistema completamente autonomo. Soprattutto se il progetto è in qualche modo ereditato e non si accede per un po '. Voglio tornare e farlo funzionare senza modifiche. Nuget è un singolo punto di fallimento che non voglio avere.
Telavian

2
@Howiecamp La nostra soluzione è ospitare il nostro server nuget e mettere tutti i pacchetti nuget, interni come esterni, in GIT-LFS. Questo rimuove il singolo punto di errore e mantiene tutto ben sotto il controllo della versione. Ma ancora non controlliamo la cartella dei pacchetti - e usiamo ancora il ripristino automatico dei pacchetti
Casper Leon Nielsen

30

Sì. Considera la directory "packages" come equivalente alla directory "libs" che hai menzionato nella tua domanda. Questo è l'approccio che adotto personalmente con i miei progetti OSS.

Stiamo esaminando funzionalità che consentirebbero a MSBuild di scaricare automaticamente i pacchetti necessari, ma che non è stato implementato (a partire da NuGet 1.1).

Penso che alcune persone possano aver già implementato tali funzionalità da sole, ma il nostro piano è di cercare di incorporare quella funzionalità in NuGet 1.2 o 1.3, si spera.


10
Mi piacerebbe sicuramente vedere quella caratteristica aggiunta. Sarebbe bello poter avere pacchetti tirati giù come necessario su un server CI o un PC di sviluppo, in modo da evitare di gonfiare il repository di controllo del codice sorgente con DLL di terze parti.
John Mills

2
Se il gestore di pacchetti in Visual Studio e lo strumento a riga di comando potessero "riparare i pacchetti", sarebbe fantastico.
Shaun Wilson

1
Forse sarebbe bene rimuovere / modificare questa risposta ora che è obsoleta
Lex

3
@Tim risposta non è attuale imho
Edward Wilde

4
Questa risposta è ancora attuale. Considera i pacchetti che non sono nel repository globale (nessun modo per ripararli / scaricarli). IMHO è una buona pratica memorizzare i pacchetti nel sistema di controllo delle versioni.
Pavel Hodek

6

Nonostante tutte le risposte qui, è ancora una semplice ole 'orribile soluzione non avere tutte le dipendenze sotto "un qualche tipo" di controllo della versione.

Per GIT, questo significherebbe GIT-LFS.

Il recente episodio con NPM mostra il motivo: se il repository Internet da cui dipendi si rompe, non è disponibile ecc., Allora sei fottuto, vero?

Non sei più in grado di costruire le tue cose e quindi non sei in grado di consegnarle.


1
Questo è un punto MOLTO buono. Anche se abbiamo il nostro server NuGet interno, possiamo fare affidamento su di esso per essere sempre disponibile durante la compilazione? Inoltre, quanto spesso cambiano i nostri pacchetti che avremmo sempre bisogno di ottenere una nuova copia per ogni build?
Josh P,

npmsi è rotto perché non ha annullato l'elenco dei pacchetti, in realtà li ha cancellati. NuGet non lo fa; se in qualsiasi momento non è possibile accedere a NuGet, qualcosa è terribilmente sbagliato. Non penso che archiviare una craptonne di dipendenze in git sia una buona soluzione: blocca semplicemente le tue dipendenze su una versione specifica e hai un mirror tra te e in Internet se questo è importante per te.
Dan

2
"NuGet non esegue questa operazione". Bene, hudiluhu, hai appena fatto delle promesse per il futuro di un dominio che è completamente fuori dal tuo controllo. Nel mondo reale le cose fuori dalla tua area di controllo, beh, sono fuori dalla tua area di controllo. Questo vale per NuGet e Npm. Inoltre la tua idea di "specchio" è esattamente ciò che propongo qui, ma nel tuo mondo lo "specchio" non è supportato da alcun tipo di schema controllato dalla versione. Ancora una volta non hai risolto il problema che ti sei prefissato.
Casper Leon Nielsen

5

Da quando ho posto la domanda, ho adottato il seguente approccio in modo da non dover controllare nella directory dei pacchetti di toplovel .

In un file build.msbuild di primo livello:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

In ogni file project.csproj

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>

2
Funziona, ma di questi tempi è meglio usare solo il ripristino del pacchetto abilitato integrato
Scott Weinstein

4

Mi rendo conto che la realtà era diversa quando questa domanda è stata originariamente pubblicata e risposta, ma fortunatamente la risposta è cambiata un po '. È ora possibile usare NuGet per scaricare le dipendenze tramite MSBuild usando un evento Pre-Build. Non è necessario inserire la cartella dei pacchetti nel repository di codice, tutte le dipendenze verranno scaricate e / o aggiornate durante la compilazione. Potrebbe essere una soluzione alternativa, ma sembra abbastanza decente. Vedere il seguente post del blog per i dettagli: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html


4
Ero eccitato finché non mi sono ricordato che questo richiede che il server di compilazione acceda al repository NuGet e questo non è l'unico posto in cui ho lavorato dove i server di compilazione non possono vedere Internet. Tornerò a controllare l'albero dei pacchetti in ...
piers7


3

Questo post è diventato molto obsoleto. La risposta è ancora NO, ma la soluzione è cambiata. A partire da NuGet 2.7+ è possibile abilitare il ripristino automatico dei pacchetti senza includere il file NuGet.exe nell'origine (questo è a dir poco indesiderabile) e se si utilizza un qualsiasi DVCS moderno è possibile ignorare la cartella dei pacchetti. Se hai bisogno di personalizzazioni speciali, puoi creare un file nuget.config nella root della soluzione.

http://docs.nuget.org/docs/reference/package-restore

Inoltre, con il nuovo formato csproj puoi evitare anche i file nuget.config extra poiché ora è integrato. Dai un'occhiata a questo post che lo spiega meglio:

La cartella .nuget dovrebbe essere aggiunta al controllo della versione?

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.