Udostępnij za pośrednictwem


Tworzenie pakietów dla platformy Xamarin za pomocą Visual Studio 2017 lub 2019

Pakiet dla platformy Xamarin zawiera kod, który korzysta z natywnych interfejsów API w iOS, Android i Windows, w zależności od systemu operacyjnego czasu wykonywania. Chociaż jest to proste, lepiej jest umożliwić deweloperom korzystanie z pakietu z bibliotek PCL lub .NET Standard za pośrednictwem wspólnego obszaru powierzchni interfejsu API.

W tym przewodniku użyjesz Visual Studio 2017 lub 2019, aby utworzyć międzyplatformowy pakiet NuGet, który może być używany w projektach mobilnych w iOS, Android i Windows.

  1. Wymagania wstępne
  2. Tworzenie struktury projektu i kodu abstrakcji
  3. Pisanie kodu specyficznego dla platformy
  4. Tworzenie i aktualizowanie pliku nuspec
  5. Spakuj składnik
  6. Tematy pokrewne

Wymagania wstępne

  1. Visual Studio 2017 lub 2019 z platformami platforma uniwersalna systemu Windows (UWP) i Xamarin. Zainstaluj bezpłatną wersję Community z visualstudio.com. Możesz również korzystać z wersji Professional i Enterprise. Aby uwzględnić narzędzia platformy UWP i Xamarin, wybierz instalację niestandardową i sprawdź odpowiednie opcje.
  2. NuGet interfejsu wiersza polecenia. Pobierz najnowszą wersję nuget.exe z nuget.org/downloads, zapisując ją w wybranej lokalizacji. Następnie dodaj lokalizację do zmiennej środowiskowej PATH, jeśli jeszcze nie jest.

Uwaga

nuget.exe to samo narzędzie interfejsu wiersza polecenia, a nie instalator, dlatego pamiętaj, aby zapisać pobrany plik z przeglądarki zamiast go uruchomić.

Tworzenie struktury projektu i kodu abstrakcji

  1. Pobierz i uruchom rozszerzenie Szablony wtyczek .NET Standard dla wielu platform dla Visual Studio. Te szablony ułatwiają tworzenie niezbędnej struktury projektu dla tego przewodnika.

  2. W Visual Studio 2017, Plik > nowy > Project, wyszukaj Plugin, wybierz szablon Wtyczka biblioteki .NET Standard dla wielu platform, zmień nazwę na LoggingLibrary, a następnie kliknij przycisk OK.

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

    W Visual Studio 2019, Plik > nowy > Project, wyszukaj Plugin, wybierz szablon Wtyczka biblioteki .NET Standard dla wielu platform, a następnie kliknij przycisk Dalej.

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

    Zmień nazwę na LoggingLibrary, a następnie kliknij przycisk Utwórz.

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

Wynikowe rozwiązanie zawiera dwa projekty udostępnione wraz z różnymi projektami specyficznymi dla platformy:

  • Projekt ILoggingLibrary , który znajduje się w ILoggingLibrary.shared.cs pliku, definiuje interfejs publiczny (obszar powierzchni interfejsu API) składnika. W tym miejscu definiujesz interfejs dla biblioteki.
  • Drugi projekt udostępniony zawiera kod, w CrossLoggingLibrary.shared.cs którym będzie znajdować implementację interfejsu abstrakcyjnego specyficzną dla platformy w czasie wykonywania. Zazwyczaj nie trzeba modyfikować tego pliku.
  • Projekty specyficzne dla platformy, takie jak LoggingLibrary.android.cs, zawierają natywną implementację interfejsu w odpowiednich LoggingLibraryImplementation.cs plikach (VS 2017) lub LoggingLibrary.<PLATFORM>.cs (VS 2019). W tym miejscu utworzysz kod biblioteki.

Domyślnie plik ILoggingLibrary.shared.cs projektu zawiera definicję interfejsu ILoggingLibrary , ale nie ma metod. Na potrzeby tego przewodnika dodaj metodę Log w następujący sposób:

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

Pisanie kodu specyficznego dla platformy

Aby zaimplementować implementację interfejsu ILoggingLibrary i jego metod specyficzną dla platformy, wykonaj następujące czynności:

  1. LoggingLibraryImplementation.cs Otwórz plik (VS 2017) lub LoggingLibrary.<PLATFORM>.cs (VS 2019) dla każdego projektu platformy i dodaj niezbędny kod. Na przykład (przy użyciu 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. Powtórz tę implementację w projektach dla każdej platformy, którą chcesz obsługiwać.

  3. Kliknij rozwiązanie prawym przyciskiem myszy i wybierz pozycję Kompiluj rozwiązanie , aby sprawdzić swoją pracę i utworzyć artefakty, które pakujesz dalej. Jeśli wystąpią błędy dotyczące brakujących odwołań, kliknij rozwiązanie prawym przyciskiem myszy, wybierz pozycję Przywróć NuGet Pakiety, aby zainstalować zależności i ponownie skompilować.

Uwaga

Jeśli używasz programu Visual Studio 2019, przed wybraniem pozycji Przywróć pakiety NuGet i próbujesz ponownie skompilować, musisz zmienić wersję programu MSBuild.Sdk.Extras na 2.0.54 w programie LoggingLibrary.csproj. Do tego pliku można uzyskać dostęp tylko po kliknięciu projektu prawym przyciskiem myszy (poniżej rozwiązania) i wybraniu polecenia Unload Project, po którym kliknij prawym przyciskiem myszy zwolniony projekt i wybierz polecenie Edit LoggingLibrary.csproj.

Uwaga

Do skompilowania dla iOS potrzebny jest sieciowy komputer Mac połączony z Visual Studio zgodnie z opisem w temacie Introduction to Xamarin.iOS for Visual Studio (Wprowadzenie do platformy Xamarin.iOS). Jeśli nie masz dostępnego komputera Mac, wyczyść projekt iOS w menedżerze konfiguracji (krok 3 powyżej).

Tworzenie i aktualizowanie pliku nuspec

  1. Otwórz wiersz polecenia, przejdź do LoggingLibrary folderu o jeden poziom poniżej miejsca, w którym .sln znajduje się plik, i uruchom polecenie NuGetspec, aby utworzyć plik początkowyPackage.nuspec:

    nuget spec
    
  2. Zmień nazwę tego pliku na LoggingLibrary.nuspec i otwórz go w edytorze.

  3. Zaktualizuj plik, aby był zgodny z poniższymi wartościami, zastępując YOUR_NAME odpowiednią wartością. Wartość <id> musi być unikatowa w nuget.org (zobacz konwencje nazewnictwa opisane w temacie Tworzenie pakietu). Należy również pamiętać, że należy również zaktualizować tagi autora i opisu lub wystąpił błąd podczas kroku pakowania.

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

Porada

Możesz sufiksować wersję pakietu za pomocą -alpha-beta polecenia lub -rc oznaczyć pakiet jako wersja wstępną, sprawdź wersje wersji wstępnej, aby uzyskać więcej informacji na temat wersji wstępnych.

Dodawanie zestawów odwołań

Aby uwzględnić zestawy referencyjne specyficzne dla platformy, dodaj następujące elementy do <files> elementu odpowiedniego LoggingLibrary.nuspec dla obsługiwanych platform:

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

Uwaga

Aby skrócić nazwy plików DLL i XML, kliknij prawym przyciskiem myszy dowolny projekt, wybierz kartę Biblioteka i zmień nazwy zestawów.

Dodawanie zależności

Jeśli masz określone zależności dla implementacji natywnych, użyj <dependencies> elementu z elementami <group> , aby je określić, na przykład:

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

Na przykład następujące polecenie ustawi element iTextSharp jako zależność dla obiektu docelowego protokołu UAP:

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

Końcowy plik nuspec

Ostateczny .nuspec plik powinien teraz wyglądać podobnie do poniższego, gdzie ponownie YOUR_NAME należy zastąpić odpowiednią wartością:

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

Spakuj składnik

Po zakończeniu .nuspec odwoływania się do wszystkich plików, które należy uwzględnić w pakiecie, możesz uruchomić pack polecenie :

nuget pack LoggingLibrary.nuspec

Spowoduje to wygenerowanie LoggingLibrary.YOUR_NAME.1.0.0.nupkg. Otwarcie tego pliku w narzędziu, takim jak NuGet Package Explorer i rozwinięcie wszystkich węzłów, zostanie wyświetlona następująca zawartość:

NuGet Package Explorer showing the LoggingLibrary package

Porada

Plik .nupkg jest tylko plikiem ZIP z innym rozszerzeniem. Możesz również sprawdzić zawartość pakietu, zmieniając wartość .nupkg na .zip, ale pamiętaj o przywróceniu rozszerzenia przed przekazaniem pakietu do nuget.org.

Aby udostępnić pakiet innym deweloperom, postępuj zgodnie z instrukcjami w temacie Publikowanie pakietu.