2016-01-05 6 views
9

Come si impacchetta una libreria .NET in un modo moderno e generico per la pubblicazione tramite NuGet? Supponiamo di avere un singolo assembly AnyCPU che desidero rendere disponibile sulla piattaforma .NET Framework 4.6.Come impacchettare una libreria di .NET Framework?

Si tratta di una serie di domande e risposte che documentano le mie scoperte sul tema del pacchetto di authoring moderna NuGet, concentrandosi in particolare sulle modifiche introdotte con NuGet 3. Si può anche essere interessati a alcune domande correlate:

+1

Questa è una domanda reale? Perché ci sono un sacco di tutorial sulla creazione di pacchetti NuGet, pacchetti Chocolatey, guide su come costruire ognuno di questi tipi. Infatti, la risposta postata è confusa perché omette informazioni importanti come quello che è nuspec e come dovrebbe essere usato. Include anche alcune cattive pratiche come la distribuzione di cose direttamente a 'bin \ Release' –

+1

@CodeCaster Spiacente, internet è caduto mentre tentava di modificarlo. Sì, mio ​​errore – Basic

risposta

12

Si vuole creare e pubblicare un pacchetto NuGet con il seguente contenuto:

  • l'assembly contenente il codice (dll).
  • Il file di simboli di debug (.pdb).
  • Il file di documentazione XML (.xml), assumendo che sia stato abilitato nelle impostazioni del progetto.

Mentre la ragione per la pubblicazione del codice è ovvio, gli altri due sono la pena ampliando:

  • il file di simboli di debug consente al runtime per popolare le tracce di stack con i numeri di riga del codice e maggio fornire inoltre informazioni aggiuntive a un debugger collegato. Includere questo file nel pacchetto NuGet è un modo molto semplice per migliorare l'esperienza di risoluzione dei problemi associata alla libreria.
  • Il XML documentation file viene utilizzato da Visual Studio per visualizzare tooltip che forniscono documentazione sui metodi e i loro argomenti agli utenti della libreria. Questo evita di dover fare riferimento a una documentazione esterna, aumentando l'usabilità della tua libreria.

Un pacchetto NuGet è, in sostanza, un file zip con i tuoi contenuti più alcuni metadati. Per pubblicare questa libreria .NET, è necessario creare un pacchetto con la seguente struttura (metadati omesso):

\---lib 
    \---net46 
      MyLibrary.dll 
      MyLibrary.pdb 
      MyLibrary.XML 

In poche parole, tutto in lib \ net46 verrà utilizzato quando il pacchetto è installato in un .NET Progetto Quadro 4.6 ed è esattamente ciò di cui hai bisogno. Tutti e tre i file verranno dalla directory di output build del progetto sotto la configurazione di build Release.

Il modo più semplice per creare un pacchetto NuGet è utilizzare l'eseguibile della riga di comando NuGet. Creare una directory nella soluzione (ad es. MyLibrary \ NuGet) e copiare nuget.exe in questa directory. Per definire la struttura del pacchetto di NuGet della vostra libreria, creare un file .nuspec nella stessa directory (ad es MyLibrary.nuspec), usando il seguente come modello:

<?xml version="1.0"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 
    <metadata minClientVersion="3.2"> 
     <id>Example.MyLibrary</id> 
     <version>1.0.0</version> 
     <authors>Firstname Lastname</authors> 
     <description>Example of a simple .NET Framework 4.6 library.</description> 
     <dependencies> 
      <dependency id="Newtonsoft.Json" version="8.0.1" /> 
     </dependencies> 
    </metadata> 
    <files> 
     <file src="..\bin\Release\MyLibrary.*" target="lib\net46" /> 
    </files> 
</package> 

Assicurarsi di impostare l'azione build di NuGet. exe e il.file nuspec su None, per evitare che vengano toccati inutilmente dal processo di compilazione.

Se il progetto è configurato in base ai modelli di progetto standard di Visual Studio, tutti i tre output rilevanti del progetto (MyLibrary.dll, MyLibrary.xml e MyLibrary.pdb) saranno presenti nella directory bin \ Release e nel carattere jolly il modello nell'esempio ne copierà tutti nelle posizioni appropriate nel pacchetto NuGet.

L'elenco delle dipendenze deve rispecchiare il file packages.config nella directory del progetto. Se la tua libreria non ha dipendenze da altri pacchetti NuGet, puoi semplicemente omettere l'elemento <dependencies>.

Costruisci la soluzione utilizzando la configurazione di rilascio prima di procedere.

È possibile creare il pacchetto utilizzando il comando nuget.exe pack MyLibrary.nuspec. Questo genererà un pacchetto chiamato con l'ID specificato nel file .nuspec, ad es. Example.MyLibrary.1.0.0.nupkg. Puoi caricare questo file nel tuo repository di pacchetti NuGet e procedere direttamente al suo utilizzo come faresti con qualsiasi altro pacchetto NuGet.

Trovo utile utilizzare uno script PowerShell per avviare la generazione del pacchetto NuGet, soprattutto se è necessario eseguire la pre-elaborazione dei contenuti, come spesso accade con progetti più complessi. Ecco un esempio di uno script PowerShell che utilizzerà nuget.exe nella stessa directory di creare pacchetti per tutti i file .nuspec nella stessa directory:

# Delete any existing output. 
Remove-Item *.nupkg 

# Create new packages for any nuspec files that exist in this directory. 
Foreach ($nuspec in $(Get-Item *.nuspec)) 
{ 
    .\NuGet.exe pack "$nuspec" 
} 

se si include nel vostro progetto, assicurarsi di impostare l'azione di compilazione dello script PowerShell su Nessuno, per evitare che venga inutilmente toccata dal processo di creazione.

Una libreria di esempio e i relativi file di imballaggio sono available on GitHub. La soluzione corrispondente a questa risposta è SimpleNetFrameworkLibrary.