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.
- Pré-requisitos
- Criar a estrutura do projeto e o código de abstração
- Escreva o código específico para sua plataforma
- Criar e atualizar o arquivo .nuspec
- Empacotar o componente
- Tópicos relacionados
Pré-requisitos
- 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.
- 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
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.
No Visual Studio 2017, Arquivo > Novo > Project, pesquise
Plugin
, selecione o modelo de Plug-in de Biblioteca Padrão .NET multiplataforma, altere o nome para LoggingLibrary e clique em OK.No Visual Studio 2019, Arquivo > Novo > Project, pesquise
Plugin
, selecione o modelo de Plug-in de Biblioteca Padrão .NET multiplataforma e clique em Avançar.Altere o nome para LoggingLibrary e clique em Criar.
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 noILoggingLibrary.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 respectivosLoggingLibraryImplementation.cs
arquivos (VS 2017) ouLoggingLibrary.<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:
Abra o
LoggingLibraryImplementation.cs
arquivo (VS 2017) ouLoggingLibrary.<PLATFORM>.cs
(VS 2019) de cada projeto de plataforma e adicione o código necessário. Por exemplo (usando o projeto deAndroid
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"); } } }
Repita essa implementação nos projetos para cada plataforma às quais você deseja dar suporte.
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.Extras
2.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
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 comandospec
do NuGet para criar o arquivoPackage.nuspec
inicial:nuget spec
Renomeie este arquivo para
LoggingLibrary.nuspec
e abra-o em um editor.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:
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.