2015-10-09 2 views
5

Qual è il modo migliore per leggere (idealmente tramite C#) i pacchetti elencati nei file packages.config?Come leggere l'elenco dei pacchetti NuGet in packages.config in modo programmatico?

All'interno del nostro repository di codice sorgente ho un sacco di soluzioni e progetti e anche un sacco di file packages.config. Sto cercando di creare un elenco consolidato di pacchetti (e versioni) in uso attraverso il mio repository di codice sorgente.

Posso vedere che è disponibile un pacchetto NuGet.Core: come potrei utilizzarlo per raggiungere il mio obiettivo?

Grazie

+0

È XML quindi un XMLReader dovrebbe eseguire il lavoro –

+0

Sono solo file XML. Sarai in grado di leggerli e interpretarli abbastanza facilmente usando lo spazio dei nomi 'System.Xml' –

+0

NuGet è open source, quindi perché non riutilizzare il suo codice? –

risposta

7

Se non si desidera leggere il codice XML direttamente è possibile installare il pacchetto NuGet.Core NuGet e quindi utilizzare la classe PackageReference.

Ecco un esempio di codice che utilizza questa classe per stampare l'ID del pacchetto e la sua versione.

string fileName = @"c:\full\path\to\packages.config"; 

var file = new PackageReferenceFile(fileName); 
foreach (PackageReference packageReference in file.GetPackageReferences()) 
{ 
    Console.WriteLine("Id={0}, Version={1}", packageReference.Id, packageReference.Version); 
} 

Avrete bisogno di trovare i file di packages.config te stesso, che probabilmente si può fare con una ricerca di directory, qualcosa di simile:

foreach (string fileName in Directory.EnumerateFiles("d:\root\path", "packages.config", SearchOption.AllDirectories)) 
{ 
    // Read the packages.config file... 
} 
+0

Esattamente quello che stavo cercando - grazie. –

0

Come suggerito dovrai installare NuGet.Core, la tua soluzione potrebbe avere diversi progetti al suo interno, quindi è bene sapere come specificare il nome del progetto durante l'installazione. Diciamo che la tua soluzione è MySolution e hai due progetti Project01 & Project02 e si desidera installare solo in Project02.

Install-Package NuGet.Core -ProjectName Project02

Successivamente sarà necessario aggiungere un'istruzione using nella pagina whatever.cs che si sta per fare il vostro lavoro per indirizzare il pacchetto e diciamo che si desidera solo per ottenere il numero di versione in modo da poter stampare fuori da qualche parte sul tuo sito web. Questo è in realtà ciò che volevo fare.

using NuGet;

prossima volevo arrivare a un pacchetto specifico e leggerlo è il numero di versione in modo che quando rilasciamo il mio software ho un identificatore visivo in un certo posto sul mio sito web che posso andare e vedere la versione che è in produzione.

ecco il codice che ho scritto per compilare un'etichetta Webforms sulla mia pagina.

protected void Page_Load(Object sender, EventArgs e) 
    { 
     var pkgRefpath = Server.MapPath("~/packages.config"); 

     PackageReferenceFile nugetPkgConfig = new PackageReferenceFile(pkgRefpath); 
     IEnumerable<PackageReference> allPackages = nugetPkgConfig.GetPackageReferences(); 

     var newtonsoftPkg = (
      from pkg in allPackages 
      where pkg.Id == "Newtonsoft.Json" 
      select pkg 
     ).FirstOrDefault(); 

     if (newtonsoftPkg== null) return; 
      var newtonsoftPkg_Version = newtonsoftPkg.Version; 

     ltrNewtonsoftVer.Text = newtonsoftPkg_Version.ToString(); 
    } 

Questa è una risposta un po 'diversa da quella domanda, ma questo mostra la soluzione che ho finito con per le mie esigenze Dopo aver trovato questo Domanda/risposta e la modifica di quello che ho imparato per soddisfare le mie esigenze. Spero che possa aiutare qualcun altro.