Tworzenie pakietów platformy UWP

Universal Windows Platform (UWP) udostępnia wspólną platformę aplikacji dla każdego urządzenia z systemem Windows 10. W tym modelu aplikacje platformy UWP mogą wywoływać zarówno interfejsy API WinRT, które są wspólne dla wszystkich urządzeń, jak i interfejsy API (w tym Win32 i .NET), które są specyficzne dla rodziny urządzeń, na których działa aplikacja.

W tym przewodniku utworzysz pakiet NuGet z natywnym składnikiem platformy UWP (w tym kontrolką XAML), który może być używany zarówno w projektach zarządzanych, jak i natywnych.

Wymagania wstępne

  1. Visual Studio 2017 lub Visual Studio 2015 r. Zainstaluj wersję Community Edition 2017 bezpłatnie z visualstudio.com; Można również korzystać z wersji Professional i Enterprise.

  2. Interfejs wiersza polecenia narzędzia NuGet. Pobierz najnowszą wersję nuget.exe z nuget.org/downloads i zapisz ją w wybranej przez siebie lokalizacji (pobrany plik to bezpośrednio .exe). Następnie dodaj lokalizację do zmiennej środowiskowej PATH, jeśli jeszcze nie jest.

Utwórz składnik Windows Runtime dla platformy UWP

  1. W Visual Studio, wybierz Plik > Nowy > Projekt, rozwiń węzeł Visual C++ > Windows > Uniwersalny, wybierz szablon Windows Runtime Składnik (Uniwersalny Windows), zmień nazwę na ImageEnhancer, a następnie kliknij przycisk OK. Zaakceptuj wartości domyślne dla Wersji Docelowej i Minimalnej Wersji, gdy zostanie wyświetlony monit.

    Tworzenie nowego projektu składnika Windows Runtime na platformie UWP

  2. Kliknij prawym przyciskiem myszy projekt w Solution Explorer, wybierz pozycję Dodaj > nowy element, kliknij węzeł Visual C++ > XAML, wybierz węzeł Kontrolka szablonu, i zmień nazwę na AwesomeImageControl.cpp, a następnie kliknij Dodaj:

    Dodawanie nowego elementu kontrolki szablonu XAML do projektu

  3. Kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz pozycję Właściwości. Na stronie Właściwości rozwiń Configuration Properties > C/C++, a następnie kliknij Output Files. W okienku po prawej stronie zmień wartość pozycji Generuj pliki dokumentacji XML na Tak:

    Ustawienie generowania plików dokumentacji XML na wartość Tak

  4. Kliknij prawym przyciskiem myszy rozwiązanie , wybierz pozycję Kompilacja wsadowa, zaznacz trzy pola Debug w oknie dialogowym, jak przedstawiono poniżej. Dzięki temu podczas kompilacji wygenerujesz pełny zestaw artefaktów dla każdego z systemów docelowych, które Windows obsługuje.

    Kompilacja wsadowa

  5. W oknie dialogowym Kompilacja wsadowa kliknij pozycję Kompiluj, aby zweryfikować projekt i utworzyć pliki wyjściowe potrzebne dla pakietu NuGet.

Uwaga / Notatka

W tym przewodniku użyjesz artefaktów debugowania dla pakietu. W przypadku pakietu nie do debugowania sprawdź opcje Release w oknie dialogowym Batch Build i zapoznaj się z wynikowymi folderami wydania w kolejnych tych krokach.

Tworzenie i aktualizowanie pliku nuspec

Aby utworzyć plik początkowy .nuspec , wykonaj trzy poniższe kroki. Poniższe sekcje przeprowadzą Cię przez inne niezbędne aktualizacje.

  1. Otwórz wiersz polecenia i przejdź do folderu zawierającego ImageEnhancer.vcxproj (będzie to podfolder poniżej miejsca, w którym znajduje się plik rozwiązania).

  2. Uruchom polecenie NuGet spec , aby wygenerować ImageEnhancer.nuspec (nazwa pliku jest pobierana z nazwy .vcxproj pliku):

    nuget spec
    
  3. Otwórz ImageEnhancer.nuspec plik w edytorze i zaktualizuj go, 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>ImageEnhancer.YOUR_NAME</id>
        <version>1.0.0</version>
        <title>ImageEnhancer</title>
        <authors>YOUR_NAME</authors>
        <owners>YOUR_NAME</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Awesome Image Enhancer</description>
        <releaseNotes>First release</releaseNotes>
        <copyright>Copyright 2016</copyright>
        <tags>image enhancer imageenhancer</tags>
        </metadata>
    </package>
    

Uwaga / Notatka

W przypadku pakietów utworzonych do użytku publicznego zwróć szczególną uwagę na <tags> element, ponieważ te tagi pomagają innym znaleźć pakiet i zrozumieć, co robi.

Dodawanie metadanych Windows do pakietu

Składnik Windows Runtime wymaga metadanych opisujących wszystkie jego publicznie dostępne typy, co umożliwia korzystanie z składnika przez inne aplikacje i biblioteki. Te metadane znajdują się w pliku winmd, który jest tworzony podczas kompilowania projektu i musi być uwzględniony w pakiecie NuGet. Plik XML z danymi funkcji IntelliSense jest również kompilowany w tym samym czasie i powinien również zostać uwzględniony.

Dodaj następujący <files> węzeł do .nuspec pliku:

<package>
    <metadata>
        ...
    </metadata>

    <files>
        <!-- WinMd and IntelliSense files -->
        <file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
        <file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
    </files>
</package>

Dodawanie zawartości XAML

Aby dołączyć kontrolkę XAML do składnika, należy dodać plik XAML zawierający domyślny szablon kontrolki (wygenerowany przez szablon projektu). Dotyczy to również <files> sekcji:

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- XAML controls -->
        <file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>

    </files>
</package>

Dodawanie bibliotek implementacji natywnej

W składniku podstawowa logika typu ImageEnhancer znajduje się w kodzie natywnym, który znajduje się w różnych ImageEnhancer.dll zestawach generowanych dla każdego docelowego środowiska uruchomieniowego (ARM, x86 i x64). Aby uwzględnić je w pakiecie, odwołaj się do nich w sekcji <files> wraz z powiązanymi plikami zasobów PRI.

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- DLLs and resources -->
        <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
        <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>

        <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
        <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>

        <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
        <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>

        <file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
        <file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>

    </files>
</package>

Dodawanie obiektów docelowych

Następnie projekty C++ i JavaScript, które mogą korzystać z pakietu NuGet, potrzebują pliku .targets, aby zidentyfikować niezbędne pliki zestawu (assembly) i WINMD. (Projekty języka C# i Visual Basic wykonują to automatycznie). Utwórz ten plik, kopiując poniższy tekst do pliku ImageEnhancer.targets i zapisz go w tym samym folderze co plik .nuspec. Uwaga: ten .targets plik musi mieć taką samą nazwę jak identyfikator pakietu (np. <Id> element w .nupspec pliku):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ImageEnhancer-Platform Condition="'$(Platform)' == 'Win32'">x86</ImageEnhancer-Platform>
        <ImageEnhancer-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</ImageEnhancer-Platform>
    </PropertyGroup>
    <ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'UAP'">
        <Reference Include="$(MSBuildThisFileDirectory)..\..\lib\uap10.0\ImageEnhancer.winmd">
            <Implementation>ImageEnhancer.dll</Implementation>
        </Reference>
    <ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\runtimes\win10-$(ImageEnhancer-Platform)\native\ImageEnhancer.dll" />
    </ItemGroup>
</Project>

Następnie odwołaj się do ImageEnhancer.targets w .nuspec pliku:

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- .targets -->
        <file src="ImageEnhancer.targets" target="build\native"/>

    </files>
</package>

Końcowy plik .nuspec

Plik końcowy .nuspec 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>ImageEnhancer.YOUR_NAME</id>
    <version>1.0.0</version>
    <title>ImageEnhancer</title>
    <authors>YOUR_NAME</authors>
    <owners>YOUR_NAME</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Awesome Image Enhancer</description>
    <releaseNotes>First Release</releaseNotes>
    <copyright>Copyright 2016</copyright>
    <tags>image enhancer imageenhancer</tags>
    </metadata>
    <files>
    <!-- WinMd and IntelliSense -->
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>

    <!-- XAML controls -->
    <file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>

    <!-- DLLs and resources -->
    <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
    <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
    <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
    <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>     
    <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
    <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>

    <!-- .targets -->
    <file src="ImageEnhancer.targets" target="build\native"/>

    </files>
</package>

Spakuj składnik

Po zakończeniu tworzenia .nuspec referencji do wszystkich plików, które należy uwzględnić w pakiecie, możesz uruchomić polecenie pack

nuget pack ImageEnhancer.nuspec

To generuje ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Otwórz ten plik w narzędziu, takim jak Eksplorator pakietów NuGet, i rozwiń wszystkie węzły, aby zobaczyć następującą zawartość:

Eksplorator pakietów NuGet przedstawiający pakiet ImageEnhancer

Wskazówka

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, aby przywrócić rozszerzenie przed przekazaniem pakietu do nuget.org.

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