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.
- Wymagania wstępne
- Tworzenie struktury projektu i kodu abstrakcji
- Pisanie kodu specyficznego dla platformy
- Tworzenie i aktualizowanie pliku nuspec
- Spakuj składnik
- Tematy pokrewne
Wymagania wstępne
- 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.
- 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
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.
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.W Visual Studio 2019, Plik > nowy > Project, wyszukaj
Plugin
, wybierz szablon Wtyczka biblioteki .NET Standard dla wielu platform, a następnie kliknij przycisk Dalej.Zmień nazwę na LoggingLibrary, a następnie kliknij przycisk Utwórz.
Wynikowe rozwiązanie zawiera dwa projekty udostępnione wraz z różnymi projektami specyficznymi dla platformy:
- Projekt
ILoggingLibrary
, który znajduje się wILoggingLibrary.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 odpowiednichLoggingLibraryImplementation.cs
plikach (VS 2017) lubLoggingLibrary.<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:
LoggingLibraryImplementation.cs
Otwórz plik (VS 2017) lubLoggingLibrary.<PLATFORM>.cs
(VS 2019) dla każdego projektu platformy i dodaj niezbędny kod. Na przykład (przy użyciuAndroid
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"); } } }
Powtórz tę implementację w projektach dla każdej platformy, którą chcesz obsługiwać.
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
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
Zmień nazwę tego pliku na
LoggingLibrary.nuspec
i otwórz go w edytorze.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ść:
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.