Erstellen von Paketen für Xamarin mit Visual Studio 2017 oder 2019
Ein Paket für Xamarin enthält Code, der native APIs unter iOS, Android und Windows verwendet und von dem Betriebssystem zur Laufzeit abhängig ist. Obwohl dies ein einfacher Vorgang ist, ist es besser, wenn Entwickler das Paket aus einer PCL- oder .NET Standard-Bibliothek über eine allgemeine API-Oberfläche verarbeiten.
In dieser exemplarischen Vorgehensweise erstellen Sie mit Visual Studio 2017 oder 2019 ein plattformübergreifendes NuGet-Paket, das in mobilen Projekten unter iOS, Android und Windows verwendet werden kann.
- Voraussetzungen
- Erstellen der Projektstruktur und abstrakten Codes
- Schreiben von plattformspezifischem Code
- Erstellen und Aktualisieren der NUSPEC-Datei
- Packen der Komponente
- Verwandte Themen
Voraussetzungen
- Visual Studio 2017 oder 2019 mit Universelle Windows-Plattform (UWP) und Xamarin. Installieren Sie die Community Edition kostenlos über visualstudio.com, oder verwenden Sie die Professional bzw. Enterprise Edition. Wählen Sie eine benutzerdefinierte Installation aus, und überprüfen Sie die passenden Optionen, um UWP- und Xamarin-Tools hinzuzufügen.
- NuGet-CLI. Laden Sie die neuste Version von „nuget.exe“ unter nuget.org/downloads herunter, und speichern Sie diese an einem beliebigen Ort. Fügen Sie diesen Speicherort, falls erforderlich, anschließend der Umgebungsvariable „PATH“ hinzu.
Hinweis
„Nuget.exe“ ist kein Installer, sondern ein CLI-Tool. Vergewissern Sie sich daher, dass Sie die im Browser heruntergeladene Datei speichern, anstatt sie auszuführen.
Erstellen der Projektstruktur und abstrakten Codes
Laden Sie das plattformübergreifende .NET Standard-Plug-In für Erweiterungen von Vorlagen für Visual Studio herunter, und führen Sie es aus. Diese Vorlagen vereinfachen das Erstellen der für diese exemplarische Vorgehensweise notwendigen Projektstruktur.
Suchen
Plugin
Sie in Visual Studio 2017 dateineue >> Project nach, wählen Sie die Plattformübergreifende .NET Standardbibliotheks-Plug-In-Vorlage aus, ändern Sie den Namen in LoggingLibrary, und klicken Sie auf 'OK'.Suchen
Plugin
Sie in Visual Studio 2019 dateineue >> Project nach, wählen Sie die Plattformübergreifende .NET Standardbibliotheks-Plug-In-Vorlage aus, und klicken Sie auf "Weiter".Ändern Sie den Namen in „LoggingLibrary“, und klicken Sie auf „Erstellen“.
Die resultierende Projektmappe enthält neben verschiedenen plattformspezifischen Projekten auch zwei gemeinsam genutzte Projekte:
- Das Projekt
ILoggingLibrary
, das in der DateiILoggingLibrary.shared.cs
enthalten ist, definiert die öffentliche Schnittstelle (die API-Oberfläche) der Komponente. Hier definieren Sie die Schnittstelle zu Ihrer Bibliothek. - Das andere gemeinsam genutzte Projekt, enthält Code in
CrossLoggingLibrary.shared.cs
, die eine plattformspezifische Implementierung der abstrakten Schnittstelle zur Laufzeit findet. In der Regel müssen an dieser Datei keine Änderungen vorgenommen werden. - Die plattformspezifischen Projekte, z
LoggingLibrary.android.cs
. B. , enthalten jeweils eine native Implementierung der Schnittstelle in ihren jeweiligenLoggingLibraryImplementation.cs
(VS 2017) oderLoggingLibrary.<PLATFORM>.cs
(VS 2019)-Dateien. Hier erstellen Sie den Code Ihrer Bibliothek.
Standardmäßig enthält die Datei „ILoggingLibrary.shared.cs“ des ILoggingLibrary
-Projekts zwar eine Schnittstellendefinition, aber keine Methoden. Fügen Sie für diese exemplarische Vorgehensweise wie folgt eine Log
-Methode hinzu:
using System;
using System.Collections.Generic;
using System.Text;
namespace Plugin.LoggingLibrary
{
/// <summary>
/// Interface for LoggingLibrary
/// </summary>
public interface ILoggingLibrary
{
/// <summary>
/// Log a message
/// </summary>
void Log(string text);
}
}
Schreiben von plattformspezifischem Code
Führen Sie die folgenden Schritte aus, um eine plattformspezifische Implementierung der ILoggingLibrary
-Schnittstelle und deren Methoden zu implementieren:
Öffnen Sie die
LoggingLibraryImplementation.cs
- (VS 2017) oderLoggingLibrary.<PLATFORM>.cs
-Datei (VS 2019) der Plattformprojekte, und fügen Sie den benötigten Code hinzu. Beispiel (mithilfe desAndroid
-Plattformprojekts):using System; using System.Collections.Generic; using System.Text; namespace Plugin.LoggingLibrary { /// <summary> /// Implementation for Feature /// </summary> public class LoggingLibraryImplementation : ILoggingLibrary { /// <summary> /// Log a message /// </summary> public void Log(string text) { throw new NotImplementedException("Called Log on Android"); } } }
Wiederholen Sie diese Implementierung in den Projekten für jede Plattform, die Sie unterstützen möchten.
Klicken Sie mit der rechten Maustaste auf die Projektmappe, und wählen Sie Projektmappe erstellen aus, um Ihre Arbeit zu überprüfen und die Elemente zu erstellen, die Sie als Nächstes packen möchten. Wenn Ihnen Fehler aufgrund von fehlenden Verweisen angezeigt werden, klicken Sie mit der rechten Maustaste auf die Projektmappe, wählen Sie NuGet-Pakete wiederherstellen aus, um die Abhängigkeiten zu installieren, und erstellen Sie die Projektmappe erneut.
Hinweis
Wenn Sie Visual Studio 2019 verwenden, müssen Sie vor der Auswahl von NuGet-Pakete wiederherstellen und dem Versuch einer Neuerstellung die Version von MSBuild.Sdk.Extras
von 2.0.54
in LoggingLibrary.csproj
ändern. Auf diese Datei kann nur zugegriffen werden, indem Sie zuerst mit der rechten Maustaste auf das Projekt (unter der Projektmappe) klicken und Unload Project
auswählen. Dann klicken Sie mit der rechten Maustaste auf das entladene Projekt und wählen Edit LoggingLibrary.csproj
aus.
Hinweis
Sie benötigen für die Erstellung für iOS einen Mac im Netzwerk, für den eine Verbindung mit Visual Studio besteht. Dies wird unter Introduction to Xamarin.iOS for Visual Studio (Einführung in Xamarin.iOS für Visual Studio) beschrieben. Wenn Sie keinen Mac zur Hand haben, entfernen Sie das iOS-Projekt aus dem Konfigurations-Manager (s. Schritt 3).
Erstellen und Aktualisieren der NUSPEC-Datei
Öffnen Sie eine Eingabeaufforderung, navigieren Sie zum
LoggingLibrary
-Ordner, der sich eine Ebene unter der.sln
-Datei befindet, und führen Sie denspec
-Befehl für NuGet aus, um eine erste Version derPackage.nuspec
-Datei zu erstellen:nuget spec
Benennen Sie diese Datei in
LoggingLibrary.nuspec
um, und öffnen Sie sie im Editor.Aktualisieren Sie die Datei, damit sie wie folgt aussieht, indem Sie „IHREN_NAMEN“ durch einen passenden Wert ersetzen. Insbesondere der
<id>
-Wert muss auf nuget.org eindeutig sein. Weitere Informationen zu den Namenskonventionen finden Sie unter Creating a package (Erstellen eines Pakets). Beachten Sie außerdem, dass Sie ebenfalls die Tags für den Autor und die Beschreibung ändern müssen, damit beim Packen kein Fehler ausgelöst wird.<?xml version="1.0"?> <package > <metadata> <id>LoggingLibrary.YOUR_NAME</id> <version>1.0.0</version> <title>LoggingLibrary</title> <authors>YOUR_NAME</authors> <owners>YOUR_NAME</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Awesome application logging utility</description> <releaseNotes>First release</releaseNotes> <copyright>Copyright 2018</copyright> <tags>logger logging logs</tags> </metadata> </package>
Tipp
Sie können an Ihre Paketversion -alpha
, -beta
oder -rc
anhängen, um die Pakete als Vorabversionen zu markieren. Weitere Informationen zu Vorabversionen finden Sie unter Vorabversionen.
Hinzufügen von Verweisassemblys
Fügen Sie, abhängig davon, welche Plattformen Sie unterstützen, dem <files>
-Element von LoggingLibrary.nuspec
Folgendes hinzu, um plattformspezifische Verweisassemblys hinzuzufügen:
<!-- Insert below <metadata> element -->
<files>
<!-- Cross-platform reference assemblies -->
<file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.xml" />
<file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.dll" />
<file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.xml" />
<!-- iOS reference assemblies -->
<file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.dll" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.xml" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.xml" />
<!-- Android reference assemblies -->
<file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.dll" target="lib\MonoAndroid10\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.xml" target="lib\MonoAndroid10\Plugin.LoggingLibrary.xml" />
<!-- UWP reference assemblies -->
<file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.dll" target="lib\UAP10\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.xml" target="lib\UAP10\Plugin.LoggingLibrary.xml" />
</files>
Hinweis
Klicken Sie mit der rechten Maustaste auf ein beliebiges Projekt, wählen Sie die Registerkarte Bibliothek aus, und ändern Sie die Assemblynamen, um die Namen der DLL- und XML-Dateien zu ändern.
Hinzufügen von Abhängigkeiten
Wenn Sie über bestimmte Abhängigkeiten für native Implementierungen verfügen, verwenden Sie das <dependencies>
-Element zusammen mit <group>
-Elementen, um diese anzugeben. Z.B.:
<!-- Insert within the <metadata> element -->
<dependencies>
<group targetFramework="MonoAndroid">
<!--MonoAndroid dependencies go here-->
</group>
<group targetFramework="Xamarin.iOS10">
<!--Xamarin.iOS10 dependencies go here-->
</group>
<group targetFramework="uap">
<!--uap dependencies go here-->
</group>
</dependencies>
Im folgenden Beispiel wird „iTextSharp“ als Abhängigkeit für ein UAP-Ziel festgelegt:
<dependencies>
<group targetFramework="uap">
<dependency id="iTextSharp" version="5.5.9" />
</group>
</dependencies>
Endgültige NUSPEC-Datei
Die endgültige .nuspec
-Datei sollte nun folgendermaßen aussehen, wobei Sie erneut YOUR_NAME durch einen passenden Wert ersetzen sollten:
<?xml version="1.0"?>
<package >
<metadata>
<id>LoggingLibrary.YOUR_NAME</id>
<version>1.0.0</version>
<title>LoggingLibrary</title>
<authors>YOUR_NAME</authors>
<owners>YOUR_NAME</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Awesome application logging utility</description>
<releaseNotes>First release</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>logger logging logs</tags>
<dependencies>
<group targetFramework="MonoAndroid">
<!--MonoAndroid dependencies go here-->
</group>
<group targetFramework="Xamarin.iOS10">
<!--Xamarin.iOS10 dependencies go here-->
</group>
<group targetFramework="uap">
<dependency id="iTextSharp" version="5.5.9" />
</group>
</dependencies>
</metadata>
<files>
<!-- Cross-platform reference assemblies -->
<file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.xml" />
<file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.dll" />
<file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.xml" />
<!-- iOS reference assemblies -->
<file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.dll" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.xml" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.xml" />
<!-- Android reference assemblies -->
<file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.dll" target="lib\MonoAndroid10\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.xml" target="lib\MonoAndroid10\Plugin.LoggingLibrary.xml" />
<!-- UWP reference assemblies -->
<file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.dll" target="lib\UAP10\Plugin.LoggingLibrary.dll" />
<file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.xml" target="lib\UAP10\Plugin.LoggingLibrary.xml" />
</files>
</package>
Packen der Komponente
Mithilfe der vollständigen .nuspec
-Datei, die auf alle Dateien verweist, die Sie in das Paket einfügen müssen, können Sie jetzt den pack
-Befehl ausführen:
nuget pack LoggingLibrary.nuspec
LoggingLibrary.YOUR_NAME.1.0.0.nupkg
wird generiert. Wenn Sie diese Datei in einem Tool wie dem NuGet-Paket-Explorer öffnen und alle Knoten erweitern, werden Ihnen folgende Inhalte angezeigt:
Tipp
Bei einer .nupkg
-Datei handelt es sich um eine ZIP-Datei mit einer anderen Erweiterung. Sie können auch die Paketinhalte untersuchen, indem Sie .nupkg
in .zip
ändern. Denken Sie jedoch daran, die Erweiterung wiederherzustellen, bevor Sie ein Paket auf nuget.org hochladen.
Um Ihr Paket anderen Entwicklern zur Verfügung zu stellen, befolgen Sie die Anweisungen zum Veröffentlichen eines Pakets.