Comparteix a través de


Crear paquetes para UWP

El Plataforma universal de Windows (UWP) proporciona una plataforma de aplicaciones común para cada dispositivo que ejecuta Windows 10. Dentro de este modelo, las aplicaciones para UWP pueden llamar a las API de WinRT que son comunes a todos los dispositivos y también a las API (incluidas Win32 y .NET) específicas de la familia de dispositivos en la que se ejecuta la aplicación.

En este tutorial se crea un paquete NuGet con un componente nativo de UWP (incluido un control XAML) que se puede usar en proyectos administrados y nativos.

Prerrequisitos

  1. Visual Studio 2017 o Visual Studio 2015. Instale la edición Community 2017 de forma gratuita desde visualstudio.com; También puede usar las ediciones Professional y Enterprise.

  2. CLI de NuGet Descargue la versión más reciente de nuget.exe de nuget.org/downloads y guárdela en una ubicación de su elección (el .exe es el archivo descargable directamente). A continuación, agregue esa ubicación a la variable de entorno PATH si aún no lo está.

Crear un componente de Windows Runtime para UWP

  1. En Visual Studio, elija Archivo > Nuevo > Proyecto, expanda el nodo Visual C++ > Windows > Universal, seleccione la plantilla Windows Runtime Component (Universal Windows), cambie el nombre a ImageEnhancer y haga clic en Aceptar. Acepte los valores predeterminados para Versión de destino y Versión mínima cuando se le solicite.

    Crear un nuevo proyecto componente de Windows Runtime para UWP

  2. Haga clic con el botón derecho en el proyecto en Explorador de soluciones, seleccione Agregar > Nuevo elemento, Haga clic en el nodo Visual C++ > XAML, seleccione Templated Control, cambie el nombre a AwesomeImageControl.cpp y haga clic en Agregar:

    Agregar un nuevo elemento de control con plantilla XAML al proyecto

  3. Haga clic con el botón derecho en el proyecto en Explorador de soluciones y seleccione Properties. En la página Propiedades, expanda Propiedades de configuración > C/C++ haga clic en Output Files. En el panel de la derecha, cambie el valor de Generar archivos de documentación XML a Sí:

    Establecer Generar archivos de documentación XML en Sí

  4. Haga clic con el botón derecho en la solución ahora, seleccione Compilación por lotes y active los tres cuadros de depuración en el cuadro de diálogo, como se muestra a continuación. Esto garantiza que, al realizar una compilación, genere un conjunto completo de artefactos para cada uno de los sistemas de destino que Windows admita.

    Compilación por lotes

  5. En el cuadro de diálogo Compilación por lotes, haga clic en Compilar para comprobar el proyecto y crear los archivos de salida que necesita para el paquete NuGet.

Nota:

En esta guía paso a paso usarás los artefactos de depuración para el paquete. En el caso del paquete que no es de depuración, compruebe las opciones de versión en el cuadro de diálogo Compilación por lotes en su lugar y consulte las carpetas release resultantes en los pasos siguientes.

Creación y actualización del archivo .nuspec

Para crear el archivo inicial .nuspec , siga estos tres pasos. Las secciones siguientes le guiarán a través de otras actualizaciones necesarias.

  1. Abra un símbolo del sistema y navegue hasta la carpeta que contiene ImageEnhancer.vcxproj (esta será una subcarpeta debajo de la ubicación del archivo de solución).

  2. Ejecute el comando NuGet spec para generar ImageEnhancer.nuspec (el nombre del archivo se toma del nombre del .vcxproj archivo):

    nuget spec
    
  3. Abra ImageEnhancer.nuspec en un editor y actualícelo para que coincida con lo siguiente, reemplazando YOUR_NAME por un valor adecuado. El <id> valor, en concreto, debe ser único en nuget.org (consulte las convenciones de nomenclatura descritas en Creación de un paquete). Tenga en cuenta también que debe actualizar las etiquetas de autor y descripción o recibirá un error durante el paso de empaquetado.

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

Nota:

En el caso de los paquetes creados para el consumo público, preste especial atención al <tags> elemento, ya que estas etiquetas ayudan a otros usuarios a encontrar el paquete y a comprender lo que hace.

Agregar Windows metadatos al paquete

Un componente de Windows Runtime requiere metadatos que describen todos sus tipos disponibles públicamente, lo que permite que otras aplicaciones y bibliotecas consuman el componente. Estos metadatos se incluyen en un archivo .winmd, que se crea al compilar el proyecto y se debe incluir en el paquete NuGet. Un archivo XML con datos de IntelliSense también se compila al mismo tiempo y también debe incluirse.

Agregue el siguiente <files> nodo al .nuspec archivo:

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

Adición de contenido XAML

Para incluir un control XAML con el componente, debes agregar el archivo XAML que tiene la plantilla predeterminada para el control (según lo generado por la plantilla de proyecto). Esto también se incluye en la <files> sección :

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

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

    </files>
</package>

Adición de las bibliotecas de implementación nativas

Dentro del componente, la lógica principal del tipo ImageEnhancer está en código nativo, que se incluye en los distintos ImageEnhancer.dll ensamblados que se generan para cada entorno de ejecución de destino (ARM, x86 y x64). Para incluirlos en el paquete, haga referencia a ellos en la <files> sección junto con sus archivos de recursos .pri asociados:

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

Adición de .targets

A continuación, los proyectos de C++ y JavaScript que podrían consumir el paquete NuGet necesitan un archivo .targets para identificar los archivos de ensamblado y winmd necesarios. (Los proyectos de C# y Visual Basic lo hacen automáticamente). Cree este archivo copiando el texto siguiente en y guárdelo en la misma carpeta que el archivo /> Nota: Este .targets archivo debe tener el mismo nombre que el identificador de paquete (por ejemplo, el <Id> elemento del .nupspec archivo):

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

A continuación, consulte ImageEnhancer.targets en el archivo .nuspec:

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

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

    </files>
</package>

.nuspec final

El archivo final .nuspec debería tener ahora un aspecto similar al siguiente, donde de nuevo YOUR_NAME debe reemplazarse por un valor adecuado:

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

Empaquetar el componente

Con la referencia completa .nuspec a todos los archivos que necesita incluir en el paquete, está listo para ejecutar el pack comando :

nuget pack ImageEnhancer.nuspec

Esto genera ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Al abrir este archivo en una herramienta como el Explorador de paquetes NuGet y expandir todos los nodos, verá el siguiente contenido:

Explorador de paquetes NuGet que muestra el paquete ImageEnhancer

Sugerencia

Un .nupkg archivo es solo un archivo ZIP con una extensión diferente. También puede examinar el contenido del paquete y, a continuación, cambiar .nupkg a .zip, pero recuerde restaurar la extensión antes de cargar un paquete en nuget.org.

Para que el paquete esté disponible para otros desarrolladores, siga las instrucciones de Publicación de un paquete.