Skapa UWP-paket

Universal Windows Platform (UWP) tillhandahåller en gemensam appplattform för varje enhet som kör Windows 10. I den här modellen kan UWP-appar anropa både WinRT-API:er som är gemensamma för alla enheter och även API:er (inklusive Win32 och .NET) som är specifika för den enhetsfamilj som appen körs på.

I den här genomgången skapar du ett NuGet-paket med en inbyggd UWP-komponent (inklusive en XAML-kontroll) som kan användas i både hanterade och interna projekt.

Förutsättningar

  1. Visual Studio 2017 eller Visual Studio 2015. Installera 2017 Community Edition kostnadsfritt från visualstudio.com; du kan också använda Professional- och Enterprise-utgåvorna.

  2. NuGet CLI. Ladda ned den senaste versionen av nuget.exe från nuget.org/downloads och spara den på valfri plats (nedladdningen .exe är direkt). Lägg sedan till den platsen i path-miljövariabeln om den inte redan är det.

Skapa en UWP-Windows Runtime komponent

  1. I Visual Studio väljer du Arkiv > Nytt projekt>, expanderar noden Visual C++ > Windows > Universal, och väljer Windows Runtime-komponenten (Universal Windows) mallen, ändrar namnet till ImageEnhancer och klickar på OK. Acceptera standardvärdena för målversion och lägsta version när du uppmanas att göra det.

    Skapa ett nytt UWP-Windows Runtime komponentprojekt

  2. Högerklicka på projektet i Solution Explorer, välj Lägg till > Nytt objekt, klicka på noden Visual C++ > XAML, välj Templated Control, ändra namnet till AwesomeImageControl.cpp och klicka på Lägg till:

    Lägga till ett nytt XAML-mallkontrollobjekt i projektet

  3. Högerklicka på projektet i Solution Explorer och välj Properties. Expandera Konfigureringsegenskaper > C/C++ och klicka på Output Files. I fönstret till höger ändrar du värdet för Generera XML-dokumentationsfiler till Ja:

    Inställningen Generera XML-dokumentationsfiler till Ja

  4. Högerklicka på lösningen nu, välj Batch Build, markera de tre felsökningsrutorna i dialogrutan enligt nedan. Detta säkerställer att när du gör en version genererar du en fullständig uppsättning artefakter för vart och ett av de målsystem som Windows stöder.

    Batch Build

  5. I dialogrutan Batch Build och klicka på Skapa för att verifiera projektet och skapa de utdatafiler som du behöver för NuGet-paketet.

Anmärkning

I den här genomgången använder du felsökningsartefakter för paketet. Om du vill ha ett paket som inte är felsökningspaket kontrollerar du versionsalternativen i dialogrutan Batch Build i stället och läser de resulterande Versionsmapparna i de steg som följer.

Skapa och uppdatera .nuspec-filen

Skapa den första .nuspec filen genom att utföra de tre stegen nedan. Avsnitten som följer vägleder dig sedan genom andra nödvändiga uppdateringar.

  1. Öppna en kommandotolk och navigera till mappen som innehåller ImageEnhancer.vcxproj (detta är en undermapp nedan där lösningsfilen finns).

  2. Kör NuGet-kommandot spec för att generera ImageEnhancer.nuspec (namnet på filen hämtas från namnet på .vcxproj filen):

    nuget spec
    
  3. Öppna ImageEnhancer.nuspec i ett redigeringsprogram och uppdatera det så att det matchar följande och ersätt YOUR_NAME med ett lämpligt värde. Värdet <id> måste vara unikt för nuget.org (se namngivningskonventionerna som beskrivs i Skapa ett paket). Observera också att du också måste uppdatera taggarna för författare och beskrivning eller så får du ett fel under paketeringssteget.

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

Anmärkning

För paket som skapats för offentlig användning bör du vara särskilt uppmärksam på elementet <tags> eftersom dessa taggar hjälper andra att hitta ditt paket och förstå vad det gör.

Lägga till Windows metadata i paketet

En Windows Runtime komponent kräver metadata som beskriver alla dess offentligt tillgängliga typer, vilket gör det möjligt för andra appar och bibliotek att använda komponenten. Dessa metadata finns i en .winmd-fil som skapas när du kompilerar projektet och måste ingå i NuGet-paketet. En XML-fil med IntelliSense-data skapas också samtidigt och bör också ingå.

Lägg till följande <files> nod i .nuspec filen:

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

Lägga till XAML-innehåll

Om du vill inkludera en XAML-kontroll med komponenten måste du lägga till XAML-filen som har standardmallen för kontrollen (som genereras av projektmallen). Detta går också i avsnittet <files> :

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

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

    </files>
</package>

Lägga till de interna implementeringsbiblioteken

I din komponent finns kärnlogiken för typen ImageEnhancer i ursprunglig kod, som finns i de olika ImageEnhancer.dll samlingar som genereras för varje målmiljö (ARM, x86 och x64). Om du vill inkludera dessa i paketet refererar du till dem i <files> avsnittet tillsammans med deras associerade .pri-resursfiler:

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

Lägga till .targets

Därefter behöver C++ och JavaScript-projekt som kan använda ditt NuGet-paket en .targets-fil för att identifiera nödvändiga sammansättnings- och winmd-filer. (C# och Visual Basic projekt gör detta automatiskt.) Skapa den här filen genom att kopiera texten nedan till ImageEnhancer.targets och spara den i samma mapp som filen .nuspec. Obs! Den här .targets filen måste ha samma namn som paket-ID :t (t.ex. elementet <Id>.nupspec i filen):

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

Hänvisa sedan till ImageEnhancer.targets i din .nuspec-fil:

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

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

    </files>
</package>

Slutlig .nuspec

Den slutliga .nuspec filen bör nu se ut så här, där YOUR_NAME ska ersättas med ett lämpligt värde:

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

Packa komponenten

När den slutförda .nuspec refererar till alla filer som du behöver inkludera i paketet är du redo att köra pack kommandot:

nuget pack ImageEnhancer.nuspec

Detta genererar ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Om du öppnar den här filen i ett verktyg som NuGet-paketutforskaren och expanderar alla noder visas följande innehåll:

NuGet Package Explorer som visar ImageEnhancer-paketet

Tips/Råd

En .nupkg fil är bara en ZIP-fil med ett annat tillägg. Du kan också undersöka paketinnehållet genom att ändra .nupkg till .zip, men kom ihåg att återställa tillägget innan du laddar upp ett paket till nuget.org.

Följ anvisningarna i Publicera ett paket för att göra ditt paket tillgängligt för andra utvecklare.