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.

  1. Voraussetzungen
  2. Erstellen der Projektstruktur und abstrakten Codes
  3. Schreiben von plattformspezifischem Code
  4. Erstellen und Aktualisieren der NUSPEC-Datei
  5. Packen der Komponente
  6. Verwandte Themen

Voraussetzungen

  1. 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.
  2. 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

  1. 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.

  2. Suchen PluginSie 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'.

    New Blank App (Xamarin.Forms Portable) project in VS 2017

    Suchen PluginSie in Visual Studio 2019 dateineue >> Project nach, wählen Sie die Plattformübergreifende .NET Standardbibliotheks-Plug-In-Vorlage aus, und klicken Sie auf "Weiter".

    New Blank App (Xamarin.Forms Portable) project in VS 2019

    Ändern Sie den Namen in „LoggingLibrary“, und klicken Sie auf „Erstellen“.

    New Blank App (Xamarin.Forms Portable) configuration in VS 2019

Die resultierende Projektmappe enthält neben verschiedenen plattformspezifischen Projekten auch zwei gemeinsam genutzte Projekte:

  • Das Projekt ILoggingLibrary, das in der Datei ILoggingLibrary.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 jeweiligen LoggingLibraryImplementation.cs (VS 2017) oder LoggingLibrary.<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:

  1. Öffnen Sie die LoggingLibraryImplementation.cs- (VS 2017) oder LoggingLibrary.<PLATFORM>.cs-Datei (VS 2019) der Plattformprojekte, und fügen Sie den benötigten Code hinzu. Beispiel (mithilfe des Android-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");
            }
        }
    }
    
  2. Wiederholen Sie diese Implementierung in den Projekten für jede Plattform, die Sie unterstützen möchten.

  3. 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

  1. Öffnen Sie eine Eingabeaufforderung, navigieren Sie zum LoggingLibrary-Ordner, der sich eine Ebene unter der .sln-Datei befindet, und führen Sie den spec-Befehl für NuGet aus, um eine erste Version der Package.nuspec-Datei zu erstellen:

    nuget spec
    
  2. Benennen Sie diese Datei in LoggingLibrary.nuspec um, und öffnen Sie sie im Editor.

  3. 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:

NuGet Package Explorer showing the LoggingLibrary package

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.