Partilhar via


Criar pacotes UWP

O Plataforma Universal do Windows (UWP) fornece uma plataforma de aplicação comum para todos os dispositivos que executam Windows 10. Neste modelo, as aplicações UWP podem chamar tanto as APIs WinRT comuns a todos os dispositivos, como APIs (incluindo Win32 e .NET) específicas da família de dispositivos onde a aplicação está a correr.

Neste walkthrough, cria um pacote NuGet com um componente UWP nativo (incluindo um controlo XAML) que pode ser usado tanto em projetos Geridos como Nativos.

Pré-requisitos

  1. Visual Studio 2017 ou Visual Studio 2015. Instale gratuitamente a edição Comunidade de 2017 pela visualstudio.com; também podes usar as edições Professional e Enterprise.

  2. NuGet CLI. Descarregue a versão mais recente do nuget.exe de nuget.org/downloads, guardando-a num local à sua escolha (o download é o próprio .exe). Depois adiciona essa localização à variável de ambiente PATH, caso ainda não esteja.

Criar um componente UWP Windows Runtime

  1. No Visual Studio, escolha Ficheiro > Novo > Projeto, expanda o nó Visual C++ > Windows > Universal, selecione o modelo Componente Windows Runtime (Universal Windows), mude o nome para ImageEnhancer e clique OK. Aceite os valores padrão para Versão Alvo e Versão Mínima quando solicitado.

    Criação de um novo projeto de componente UWP Windows Runtime

  2. Clique com o botão direito no projeto em Explorador de Soluções, selecione Adicionar > Novo Item, clique no nó Visual C++ > XAML, selecione Controlo Com Modelo, altere o nome para AwesomeImageControl.cpp e clique em Adicionar:

    Adição de um novo item de Controlo Template XAML ao projeto

  3. Clique com o botão direito no projeto em Explorador de Soluções e selecione Properties. Na página de Propriedades, expanda Configuration Properties > C/C++ e clique em Output Files. No painel à direita, altere o valor de Generar Ficheiros de Documentação XML para Sim:

    Definir Generar Ficheiros de Documentação XML para sim

  4. Clique com o botão direito na solução agora, selecione Batch Build, assinale as três caixas de Depuração no diálogo, conforme mostrado abaixo. Isto garante que, ao fazer uma build, gera um conjunto completo de artefactos para cada um dos sistemas alvo que o Windows suporta.

    Construção em Lote

  5. No diálogo Batch Build, clique em Construir para verificar o projeto e criar os ficheiros de saída que precisa para o pacote NuGet.

Observação

Neste walkthrough, usas os artefactos de Debug para o pacote. Para pacotes que não sejam de depuração, verifique as opções de Lançamento na caixa de diálogo Batch Build e consulte as pastas de Lançamento resultantes nos passos seguintes.

Crie e atualize o ficheiro .nuspec

Para criar o ficheiro inicial .nuspec , faça os três passos abaixo. As secções seguintes guiam-no então por outras atualizações necessárias.

  1. Abra um prompt de comandos e navegue até à pasta que contém ImageEnhancer.vcxproj (esta será uma subpasta abaixo de onde está o ficheiro de solução).

  2. Execute o comando NuGet spec para gerar ImageEnhancer.nuspec (o nome do ficheiro é retirado do nome do .vcxproj ficheiro):

    nuget spec
    
  3. Abrir ImageEnhancer.nuspec num editor e atualizá-lo para corresponder ao seguinte, substituindo-YOUR_NAME por um valor apropriado. O <id> valor, especificamente, deve ser único entre nuget.org (ver as convenções de nomenclatura descritas em Criar um pacote). Note também que deve atualizar as etiquetas do autor e da descrição, caso contrário terá um erro durante a etapa de embalagem.

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

Observação

Para pacotes construídos para consumo público, preste especial atenção ao <tags> elemento, pois estas etiquetas ajudam os outros a encontrar o seu pacote e a perceber o que ele faz.

Adicionar metadados do Windows ao pacote

Um Componente Windows Runtime requer metadados que descrevam todos os seus tipos publicamente disponíveis, o que permite que outras aplicações e bibliotecas consumam o componente. Estes metadados estão contidos num ficheiro .winmd, que é criado quando compilas o projeto e deve ser incluído no teu pacote NuGet. Um ficheiro XML com dados IntelliSense também é construído ao mesmo tempo, e deve ser incluído também.

Adicione o seguinte <files> nó ao .nuspec ficheiro:

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

Adição de conteúdo XAML

Para incluir um controlo XAML com o seu componente, precisa de adicionar o ficheiro XAML que tem o modelo padrão do controlo (tal como gerado pelo modelo do projeto). Isto também se aplica à <files> secção:

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

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

    </files>
</package>

Adição das bibliotecas nativas de implementação

Dentro do seu componente, a lógica central do tipo ImageEnhancer está em código escrito em linguagem nativa, que está contido nas várias ImageEnhancer.dll assemblagens geradas para cada runtime de destino (ARM, x86 e x64). Para incluir estes no pacote, referencia-os na <files> secção juntamente com os seus ficheiros de recursos .pri associados:

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

Adição de .targets

De seguida, projetos em C++ e JavaScript que possam consumir o seu pacote NuGet precisam de um ficheiro .targets para identificar os ficheiros assembly e winmd necessários. (Projetos em C# e Visual Basic fazem isto automaticamente.) Crie este ficheiro copiando o texto abaixo para ImageEnhancer.targets e guardando-o na mesma pasta que o ficheiro .nuspec. Nota: Este .targets ficheiro precisa de ter o mesmo nome do ID do pacote (por exemplo, o <Id> elemento no .nupspec ficheiro):

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

Depois, consulte ImageEnhancer.targets no seu .nuspec ficheiro:

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

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

    </files>
</package>

.nuspec final

O seu ficheiro final .nuspec deve agora parecer o seguinte, onde, novamente, YOUR_NAME deve ser substituído por um valor apropriado:

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

Empacotar o componente

Com a referência completa .nuspec de todos os ficheiros que precisa de incluir no pacote, pode agora executar o comando pack.

nuget pack ImageEnhancer.nuspec

Isto gera ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Ao abrir este ficheiro numa ferramenta como o NuGet Package Explorer e ao expandir todos os nós, verá o seguinte conteúdo:

NuGet Package Explorer a exibir o pacote ImageEnhancer

Sugestão

Um .nupkg ficheiro é apenas um ficheiro ZIP com uma extensão diferente. Também pode examinar o conteúdo do pacote, alterando .nupkg para .zip, mas lembre-se de restaurar a extensão antes de carregar um pacote para nuget.org.

Para disponibilizar o seu pacote a outros programadores, siga as instruções em Publicar um pacote.