Compartilhar via


Criar pacotes para o Xamarin com Visual Studio 2017 ou 2019

Um pacote para Xamarin contém código que usa APIs nativas no iOS, Android e Windows, dependendo do sistema operacional de tempo de execução. Embora seja simples fazer isso, é preferível para permitir que os desenvolvedores consumam o pacote de um PCL ou de bibliotecas do .NET Standard por meio de uma área de superfície de API comum.

Neste passo a passo, você usa Visual Studio 2017 ou 2019 para criar um pacote de NuGet multiplataforma que pode ser usado em projetos móveis em iOS, Android e Windows.

  1. Pré-requisitos
  2. Criar a estrutura do projeto e o código de abstração
  3. Escreva o código específico para sua plataforma
  4. Criar e atualizar o arquivo .nuspec
  5. Empacotar o componente
  6. Tópicos relacionados

Pré-requisitos

  1. Visual Studio 2017 ou 2019 com Plataforma Universal do Windows (UWP) e Xamarin. Instale a edição Community gratuitamente no visualstudio.com e, claro, você também pode usar as edições Professional e Enterprise. Para incluir as ferramentas UWP e Xamarin, selecione uma instalação Personalizada e verifique as opções apropriadas.
  2. CLI do NuGet. Baixe a versão mais recente do nuget.exe de nuget.org/downloads e salve-a em um local de sua escolha. Em seguida, adicione tal local à sua variável de ambiente PATH, se ainda não tiver feito isso.

Observação

O nuget.exe é a própria ferramenta CLI e não um instalador, por isso não se esqueça de salvar o arquivo baixado do navegador em vez de executá-lo.

Criar a estrutura do projeto e o código de abstração

  1. Baixe e execute a extensão modelos de plug-in .NET Standard multiplataforma para Visual Studio. Esses modelos facilitarão a criação da estrutura de projeto necessária para este passo a passo.

  2. No Visual Studio 2017, Arquivo > Novo > Project, pesquisePlugin, selecione o modelo de Plug-in de Biblioteca Padrão .NET multiplataforma, altere o nome para LoggingLibrary e clique em OK.

    New Blank App (Xamarin.Forms Portable) project in VS 2017

    No Visual Studio 2019, Arquivo > Novo > Project, pesquisePlugin, selecione o modelo de Plug-in de Biblioteca Padrão .NET multiplataforma e clique em Avançar.

    New Blank App (Xamarin.Forms Portable) project in VS 2019

    Altere o nome para LoggingLibrary e clique em Criar.

    New Blank App (Xamarin.Forms Portable) configuration in VS 2019

A solução resultante contém dois projetos compartilhados, juntamente com uma variedade de projetos específicos da plataforma:

  • O ILoggingLibrary projeto, que está contido no ILoggingLibrary.shared.cs arquivo, define a interface pública (a área de superfície da API) do componente. É aqui que você define a interface para a biblioteca.
  • O outro projeto compartilhado contém código que CrossLoggingLibrary.shared.cs localizará uma implementação específica da plataforma da interface abstrata em tempo de execução. Normalmente não é necessário modificar esse arquivo.
  • Os projetos específicos da plataforma, como LoggingLibrary.android.cs, cada um contém uma implementação nativa da interface em seus respectivos LoggingLibraryImplementation.cs arquivos (VS 2017) ou LoggingLibrary.<PLATFORM>.cs (VS 2019). É aqui que você compila o código da biblioteca.

Por padrão, o arquivo ILoggingLibrary.shared.cs do ILoggingLibrary projeto contém uma definição de interface, mas nenhum método. Para os fins deste passo a passo, adicione um método Log da seguinte maneira:

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);
    }
}

Escreva o código específico para sua plataforma

Para implementar uma implementação específica da plataforma ILoggingLibrary e seus métodos, faça o seguinte:

  1. Abra o LoggingLibraryImplementation.cs arquivo (VS 2017) ou LoggingLibrary.<PLATFORM>.cs (VS 2019) de cada projeto de plataforma e adicione o código necessário. Por exemplo (usando o projeto de Android plataforma):

    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");
            }
        }
    }
    
  2. Repita essa implementação nos projetos para cada plataforma às quais você deseja dar suporte.

  3. Clique com o botão direito do mouse e selecione Compilar solução para verificar seu trabalho e produzir os artefatos que são empacotados em seguida. Se você receber erros sobre referências ausentes, clique com o botão direito do mouse na solução, selecione Restaurar pacotes do NuGet para instalar as dependências e recompile.

Observação

Se você estiver usando Visual Studio 2019, antes de selecionar Restaurar pacotes de NuGet e tentar recompilar, será necessário alterar a versão para MSBuild.Sdk.Extras2.0.54 dentro LoggingLibrary.csproj. Esse arquivo só pode ser acessado clicando com o botão direito do mouse no projeto (abaixo da solução) e selecionando Unload Project, após o qual você clica com o botão direito do mouse no projeto descarregado e seleciona Edit LoggingLibrary.csproj.

Observação

Para compilar para iOS, é necessário ter um Mac em rede conectado ao Visual Studio, conforme descrito em Introdução ao Xamarin.iOS para Visual Studio. Se você não tiver um Mac disponível, apague o projeto iOS no Gerenciador de Configuração (etapa 3 acima).

Criar e atualizar o arquivo .nuspec

  1. Abra um prompt de comando, navegue até a pasta LoggingLibrary que está um nível abaixo do qual o arquivo .sln está e execute o comando spec do NuGet para criar o arquivo Package.nuspec inicial:

    nuget spec
    
  2. Renomeie este arquivo para LoggingLibrary.nuspec e abra-o em um editor.

  3. Atualize o arquivo para corresponder ao seguinte, substituindo YOUR_NAME por um valor apropriado. O valor <id>, especificamente, precisa ser exclusivo no nuget.org (consulte as convenções de nomenclatura descritas em Criando um pacote). Observe que você também precisa atualizar as marcas de autor e descrição ou um erro é mostrado durante a etapa de empacotamento.

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

Dica

Você pode acrescentar o sufixo à sua versão de pacote com -alpha, -beta ou -rc para marcar o pacote como versão de pré-lançamento, consulte Versões de pré-lançamento para obter mais informações sobre as versões de pré-lançamento.

Adicionar assemblies de referência

Para incluir os assemblies de referência específicos de plataforma, adicione o seguinte ao elemento <files> de LoggingLibrary.nuspec conforme apropriado para as plataformas compatíveis:

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

Observação

Para encurtar os nomes dos arquivos DLL e XML, clique com o botão direito do mouse em qualquer projeto, selecione a guia Biblioteca e altere os nomes de assembly.

Adicionar dependências

Se você tiver dependências específicas para implementações nativas, use o elemento <dependencies> com elementos <group> especificá-los, por exemplo:

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

Por exemplo, o seguinte definiria iTextSharp como uma dependência para o destino UAP:

<dependencies>
    <group targetFramework="uap">
        <dependency id="iTextSharp" version="5.5.9" />
    </group>
</dependencies>

.nuspec final

O arquivo .nuspec final agora deve ser semelhante ao seguinte, em que novamente YOUR_NAME deve ser substituído por um valor apropriado:

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

Empacotar o componente

Depois do .nuspec terminar de referenciar todos os arquivos que você precisa incluir no pacote, você estará pronto para executar o comando pack:

nuget pack LoggingLibrary.nuspec

Isso gerará LoggingLibrary.YOUR_NAME.1.0.0.nupkg. Ao abrir este arquivo em uma ferramenta como o Explorador de Pacotes NuGet e expandir todos os nós, você verá o seguinte conteúdo:

NuGet Package Explorer showing the LoggingLibrary package

Dica

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

Para disponibilizar seu pacote para outros desenvolvedores, siga as instruções sobre Publicar um pacote.