Nuget-Projekt mit Visual Studio erstellen

Wir haben in anderen Artikeln bereits über NuGet gesprochen. Dieser Artikel stellt NuGet etwas genauer vor und erklärt, wie wir eigene Pakete erstellen und diese auf NuGet hochladen.
Was ist NuGet?
NuGet[1] ist prinzipiell ein Verzeichnis für Code-Bibliotheken. Nuget stellt nur Bibliotheken im .NET-Umfeld bereit. Darunter fallen beispielsweise das .NET Framework, .NET Core, Xamarin und Mono. Mit dieser Bibliothek können Pakete inklusive Abhängigkeiten sehr einfach Verwaltet und in einem Projekt installiert werden.
Das Visual Studio bietet eine Oberfläche zur Verwaltung an. Ansonsten kann
per Install-Package [NAME]
(Kommandozeile) ein beliebiges Paket zu einem Projekt hinzugefügt
werden.
Die Projekte sind im Funktionsumfang nur auf die Zielplattform beschränkt. Im vorherigen Artikel haben wir besprochen, wie wir ein Projekt multiplattformfähig machen können. Eine höhere Portabilität erhöht den möglichen Erfolg einer Bibliothek.
Im Grunde erlaubt Nuget das dynamische Einbinden von dritthersteller Bibliotheken, um die eigene Anwendung zu erweitern.
Welche Vorteile bietet NuGet?
NuGet ist seit einigen Jahren als Paketmanager im Visual Studio integriert. Sehr viele bekannte Projekte stellen auf Nuget ihre Bibliotheken bereit. Der größte Vorteil besteht in der Verwaltung von externen Bibliotheken. In der Anwendung müssen keine DLLs oder Ordnerstrukturen gespeichert werden.
Statt dessen speichert das Projekt nur der Namen der Bibliothek und die Version. Beim Kompilieren wird die Bibliothek (falls sie fehlt) automatisch heruntergeladen. Damit kann das Projekt unanbhängig vom aktuellen Entwickler auch von anderen Personen kompiliert werden. Das lästige Kopieren und verschieben von DLLs entfällt.
Manchmal ist es notwendig, den Download zu forcieren. Allerdings ist der generelle Aufwand sehr überschaubar.
Hinweis: Bei .NET-Core Projekten verwendet NuGet einen globalen Cache des aktuellen Benutzers. Bei älteren .NET-Framework Projekten werden die Bibliotheken im Ordner der Solution (.sln) gespeichert. Zukünftig werden Bibliotheken daher nur noch 1x pro Version anstatt pro Projekt heruntergeladen.
Vorbereitung
Um ein Nuget-Paket zu erzeugen brauchen wir ein .NET-Projekt. In der Regel ist dies ein Projekt vom Typ „Bibliothek“. Derzeit kommt es noch zu unterschieden zwischen .NET Framework und .NET Core/Standard Projekten.
Ein NuGet-Paket erzeugen
Ein NuGet-Paket kann auf verschiedene Arten erzeugt werden:
- Aufruf via Kommandozeile (alle Projekte)
- Paketerstellung in Projekteigenschaften aktivieren (.NET Core/Standard)
Kommandozeile
Wir navigieren mit der Kommandozeile in das Verzeichnis, in welchem die csproj-Datei
liegt. Dort
rufen wir nuget spec
auf. Dadurch erstellt Nuget eine Nuspec-Datei im aktuellen Verzeichnis. Diese
Datei enthält die Spezifikation des Paketes. Der Inhalt sieht in etwas folgendermaßen aus:
<?xml version="1.0"?>
<package>
<metadata>
<id>$id</id>
<version>$version</version>
<title>$title</title>
<authors>$author</authors>
<owners>$author</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
</package>
Die Nuspec-Datei hat den selben Namen wie das Projekt. Variablen wie $id$
liest NuGet aus den
Assemblyinformationen aus. Hier können auch feste Werte vergeben werden.
Zum Erstellen eines Paketes müssen wir einen Autor und eine kurze Beschreibung angeben. Ansonsten schlägt das Paketieren fehl. Die Fehlermeldung gibt recht genau an, welche Informationen falsch sind oder fehlen.
Es kann vorkommen, dass ihr folgende Meldung erhaltet:
Das Objekt des Typs "System.String" kann nicht in Typ
"NuGet.Frameworks.NuGet.Frameworks1069249.NuGetFramework"
umgewandelt werden.
Der Fehler lässt sich recht einfach beheben:
- Verwendet
nuget pack
nur bei .NET Framework Projekten (Core/Standard werden noch nicht unterstützt) - Verwendet
msbuild /t:pack
Anschließend seht ihr im Verzeichnis eine Datei wie ClassLibrary1.1.0.0.nupkg
. Dieses Paket könnt
ihr mit einem ZIP-Programm öffnen und euch die ClassLibrary1.nuspec
ansehen:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>ClassLibrary1</id>
<version>1.0.0</version>
<title>ClassLibrary1</title>
<authors>John Doe</authors>
<owners>John Doe</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Das große John Doe package</description>
<releaseNotes>First creation</releaseNotes>
<dependencies/>
</metadata>
</package>
Wie ihr sehen könnt, wurden die Platzhalter durch die Werte aus der Assembly ersetzt. Aus diesem Paket kann NuGet nun die Informationen wie Paketnamen, Autor oder die Version extrahieren.
Projekteigenschaften
Hinweis: Diese Einstellung ist derzeit nur für Projekte mit .NET Core oder Standard verfügbar.
Das Erstellen von NuGet-Paketen ist hier stark vereinfacht worden. In den Paketeinstellungen muss nur ein Häkchen gesetzt werden, damit beim Kompilieren automatisch ein Nuget-Paket erzeugt wird.

Projekteinstellungen, um ein NuGet-Paket zu erstellen
Mit den darunter liegenden Textfeldern können die diversen Felder ausgefüllt werden. Somit ist eine nuspec-Datei nicht mehr explizit notwendig. In diesen Textfeldern können die gleichen Platzhalter eingegeben werden wie in der vorherigen Nuspec-Datei.
Fazit und Ausblick
Mit den neuen Projekteinstellungen ist das Erstellen von Paketen relativ einfach. Durch die Nuget-Kommandozeile kann ein Paket ebenfalls schnell erzeugt werden.
Im nächsten Artikel sehen wir uns an, wie wir diese Pakete auf Nuget bereitstellen.
Bildquelle: Pixabay.com
- [1]: https://www.nuget.org/
- Microsoft Docs zur Paketerstellung: MSDN Paket erzeugen
2019-07-17: Fehlerhafte Formatierung korrigiert