Vytváření balíčků pro Xamarin pomocí Visual Studio 2017 nebo 2019

Balíček pro Xamarin obsahuje kód, který používá nativní rozhraní API pro iOS, Android a Windows v závislosti na operačním systému za běhu. I když je to jednoduché, je vhodnější umožnit vývojářům využívat balíček z knihoven PCL nebo .NET Standard prostřednictvím společné oblasti rozhraní API.

V tomto názorném postupu použijete Visual Studio 2017 nebo 2019 k vytvoření balíčku NuGet pro různé platformy, který lze použít v mobilních projektech v iOS, Android a Windows.

  1. Požadavky
  2. Vytvoření struktury projektu a abstrakce kódu
  3. Psaní kódu specifického pro platformu
  4. Vytvoření a aktualizace souboru .nuspec
  5. Zabalení komponenty
  6. Související témata

Požadavky

  1. Visual Studio 2017 nebo 2019 s Univerzální platforma Windows (UPW) a Xamarinem. Nainstalujte si Community edici zdarma z visualstudio.com. Samozřejmě můžete používat i edice Professional a Enterprise. Pokud chcete zahrnout nástroje pro UPW a Xamarin, vyberte vlastní instalaci a zkontrolujte příslušné možnosti.
  2. rozhraní příkazového řádku NuGet. Stáhněte si nejnovější verzi nuget.exe z nuget.org/downloads a uložte ji do libovolného umístění. Potom přidejte toto umístění do proměnné prostředí PATH, pokud ještě není.

Poznámka

nuget.exe je samotný nástroj rozhraní příkazového řádku, nikoli instalační program, takže místo jeho spuštění nezapomeňte stažený soubor uložit z prohlížeče.

Vytvoření struktury projektu a abstrakce kódu

  1. Stáhněte a spusťte rozšíření Šablony modulů plug-in pro více platforem pro Visual Studio. Tyto šablony usnadňují vytvoření potřebné struktury projektu pro tento názorný postup.

  2. V Visual Studio 2017 vyhledejte soubor > nový > Project, vyberte Pluginšablonu modulu plug-in knihovny .NET Standard pro různé platformy, změňte název na LoggingLibrary a klikněte na TLAČÍTKO OK.

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

    V Visual Studio 2019 vyhledejte soubor > nový > Project, vyhledejte Plugin, vyberte šablonu modulu plug-in knihovny .NET Standard pro různé platformy a klikněte na tlačítko Další.

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

    Změňte název na LoggingLibrary a klikněte na Vytvořit.

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

Výsledné řešení obsahuje dva sdílené projekty spolu s celou řadou projektů specifických pro platformu:

  • Projekt ILoggingLibrary , který je obsažen v ILoggingLibrary.shared.cs souboru, definuje veřejné rozhraní (oblast rozhraní API surface) komponenty. Tady definujete rozhraní pro vaši knihovnu.
  • Druhý sdílený projekt obsahuje kód, který CrossLoggingLibrary.shared.cs vyhledá implementaci konkrétní platformy abstraktního rozhraní za běhu. Tento soubor obvykle nemusíte upravovat.
  • Projekty specifické pro platformu, jako LoggingLibrary.android.csje například , obsahují nativní implementaci rozhraní v příslušných LoggingLibraryImplementation.cs souborech (VS 2017) nebo LoggingLibrary.<PLATFORM>.cs (VS 2019). Tady vytvoříte kód knihovny.

Ve výchozím nastavení soubor ILoggingLibrary ILoggingLibrary.shared.cs projektu obsahuje definici rozhraní, ale žádné metody. Pro účely tohoto návodu přidejte metodu Log následujícím způsobem:

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);
    }
}

Psaní kódu specifického pro platformu

Pokud chcete implementovat implementaci rozhraní specifickou pro platformu ILoggingLibrary a její metody, postupujte takto:

  1. LoggingLibraryImplementation.cs Otevřete soubor (VS 2017) nebo LoggingLibrary.<PLATFORM>.cs (VS 2019) každého projektu platformy a přidejte potřebný kód. Například (pomocí Android projektu platformy):

    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. Tuto implementaci opakujte v projektech pro každou platformu, kterou chcete podporovat.

  3. Klikněte pravým tlačítkem na řešení a vyberte Sestavit řešení a zkontrolujte svou práci a vytvořte artefakty, které zabalíte dál. Pokud se zobrazí chyby týkající se chybějících odkazů, klikněte pravým tlačítkem na řešení, vyberte Obnovit NuGet Balíčky pro instalaci závislostí a opětovné sestavení.

Poznámka

Pokud používáte Visual Studio 2019, před výběrem možnosti Obnovit NuGet Balíčky a pokusem o opětovné sestavení je nutné změnit verzi MSBuild.Sdk.Extras na 2.0.54 .LoggingLibrary.csproj K tomuto souboru se dostanete jenom tak, že kliknete pravým tlačítkem myši na projekt (pod řešením) a vyberete Unload Project, po kterém kliknete pravým tlačítkem myši na uvolněný projekt a vyberete Edit LoggingLibrary.csproj.

Poznámka

K sestavení pro iOS potřebujete síťovaný Mac připojený k Visual Studio, jak je popsáno v tématu Úvod do Xamarin.iOS pro Visual Studio. Pokud nemáte k dispozici Mac, vymažte iOS projekt v nástroji Configuration Manager (krok 3 výše).

Vytvoření a aktualizace souboru .nuspec

  1. Otevřete příkazový řádek, přejděte do LoggingLibrary složky, která je o jednu úroveň níže, kde .sln je soubor, a spuštěním příkazu NuGet spec vytvořte počáteční Package.nuspec soubor:

    nuget spec
    
  2. Přejmenujte tento soubor LoggingLibrary.nuspec a otevřete ho v editoru.

  3. Aktualizujte soubor tak, aby odpovídal následujícímu, a nahraďte YOUR_NAME odpovídající hodnotou. Hodnota <id> , konkrétně musí být jedinečná napříč nuget.org (viz konvence vytváření názvů popsané v tématu Vytvoření balíčku). Všimněte si také, že musíte také aktualizovat značky autora a popisu nebo se během kroku balení zobrazí chyba.

    <?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>
    

Tip

Verzi -alpha-beta balíčku můžete označovat jako předběžnou verzi nebo -rc označit jako předběžnou verzi. Další informace o verzích před vydáním najdete v předběžné verzi.

Přidání referenčních sestavení

Pokud chcete zahrnout referenční sestavení specifická pro platformu <files> , přidejte do elementu LoggingLibrary.nuspec podle potřeby podporované platformy následující:

<!-- 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>

Poznámka

Pokud chcete zkrátit názvy souborů DLL a XML, klikněte pravým tlačítkem myši na libovolný daný projekt, vyberte kartu Knihovna a změňte názvy sestavení.

Přidání závislostí

Pokud máte specifické závislosti pro nativní implementace, použijte <dependencies> element s elementy <group> k jejich určení, například:

<!-- 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>

Například následující nastavení iTextSharp jako závislosti pro cíl UAP:

<dependencies>
    <group targetFramework="uap">
        <dependency id="iTextSharp" version="5.5.9" />
    </group>
</dependencies>

Konečný .nuspec

Konečný .nuspec soubor by teď měl vypadat nějak takto, kde by se měl znovu YOUR_NAME nahradit odpovídající hodnotou:

<?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>

Zabalení komponenty

Po dokončení .nuspec odkazování na všechny soubory, které je potřeba zahrnout do balíčku, jste připraveni spustit pack příkaz:

nuget pack LoggingLibrary.nuspec

Tím se vygeneruje LoggingLibrary.YOUR_NAME.1.0.0.nupkg. Otevřete tento soubor v nástroji, jako je NuGet Průzkumník balíčků a rozbalte všechny uzly, zobrazí se následující obsah:

NuGet Package Explorer showing the LoggingLibrary package

Tip

Soubor .nupkg je pouze soubor ZIP s jinou příponou. Obsah balíčku můžete také prozkoumat změnou na , ale nezapomeňte rozšíření obnovit před nahráním .nupkg.zipbalíčku do nuget.org.

Pokud chcete balíček zpřístupnit ostatním vývojářům, postupujte podle pokynů k publikování balíčku.