Creación de paquetes para Xamarin con Visual Studio 2017 o 2019
Un paquete de Xamarin contiene código en el que se usan las API nativas en iOS, Android y Windows, según el sistema operativo del tiempo de ejecución. Aunque esto es sencillo de hacer, es preferible permitir que los desarrolladores consuman el paquete desde una PCL o bibliotecas de .NET Standard a través del área expuesta de una API común.
En este tutorial usará Visual Studio 2017 o 2019 para crear un paquete NuGet multiplataforma que se puede usar en proyectos para dispositivos móviles en iOS, Android y Windows.
- Requisitos previos
- Crear la estructura y el código de abstracción del proyecto
- Escribir el código específico de la plataforma
- Crear y actualizar el archivo .nuspec
- Empaquetar el componente
- Temas relacionados
Requisitos previos
- Visual Studio 2017 o 2019 con la Plataforma universal de Windows (UWP) y Xamarin. Instale la edición Community gratuita desde visualstudio.com; también puede usar las ediciones Professional y Enterprise, por supuesto. Para incluir las herramientas de UWP y Xamarin, seleccione una instalación personalizada y active las opciones adecuadas.
- CLI de NuGet. Descargue la versión más reciente de nuget.exe desde nuget.org/downloads y guárdela en una ubicación de su elección. Después, agregue esa ubicación a la variable de entorno PATH si aún no está.
Nota:
nuget.exe es la propia herramienta de la CLI, no un instalador, por lo que debe asegurarse de guardar el archivo descargado desde el explorador en lugar de ejecutarlo.
Crear la estructura y el código de abstracción del proyecto
Descargue y ejecute la extensión Plantillas de complemento de .NET Standard multiplataforma para Visual Studio. Estas plantillas facilitan la creación de la estructura del proyecto necesaria para este tutorial.
En Visual Studio 2017, Archivo > nuevo > Project, busque
Plugin
, seleccione la plantilla Complemento de biblioteca multiplataforma de .NET Standard Library, cambie el nombre a LoggingLibrary y haga clic en Aceptar.En Visual Studio 2019, Archivo > nuevo > Project, busque
Plugin
, seleccione la plantilla Complemento de biblioteca multiplataforma de .NET Standard y haga clic en Siguiente.Cambie el nombre a LoggingLibrary y haga clic en Crear.
La solución resultante contiene dos proyectos compartidos, junto con varios proyectos específicos de la plataforma:
- El proyecto
ILoggingLibrary
, que se encuentra en el archivoILoggingLibrary.shared.cs
, define la interfaz pública (el área expuesta de la API) del componente. Aquí es donde se define la interfaz de la biblioteca. - El otro proyecto compartido contiene código en
CrossLoggingLibrary.shared.cs
que buscará una implementación específica de la plataforma de la interfaz abstracta en tiempo de ejecución. Normalmente no es necesario modificar este archivo. - Los proyectos específicos de la plataforma, como
LoggingLibrary.android.cs
, contienen una implementación nativa de la interfaz en sus respectivosLoggingLibraryImplementation.cs
archivos (VS 2017) oLoggingLibrary.<PLATFORM>.cs
(VS 2019). Aquí es donde se compila el código de la biblioteca.
De forma predeterminada, el archivo ILoggingLibrary.shared.cs del proyecto ILoggingLibrary
contiene una definición de interfaz, pero ningún método. Para los fines de este tutorial, agregue un método Log
como se indica a continuación:
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);
}
}
Escribir el código específico de la plataforma
Para implementar una implementación específica de la plataforma de la interfaz ILoggingLibrary
y sus métodos, siga estos pasos:
Abra el archivo
LoggingLibraryImplementation.cs
(VS 2017) oLoggingLibrary.<PLATFORM>.cs
(VS 2019) de cada proyecto de plataforma y agregue el código necesario. Por ejemplo (mediante el proyecto de plataformaAndroid
):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 esta implementación en los proyectos de cada plataforma que quiera admitir.
Haga clic con el botón derecho en la solución y seleccione Compilar solución para comprobar el trabajo y generar los artefactos que se empaquetan después. Si recibe errores sobre referencias que faltan, haga clic con el botón derecho en la solución, seleccione Restaurar paquetes NuGet para instalar las dependencias y vuelva a compilar.
Nota:
Si usa Visual Studio 2019, antes de seleccionar Restaurar paquetes NuGet e intentar la recompilación, debe cambiar la versión de MSBuild.Sdk.Extras
a 2.0.54
en LoggingLibrary.csproj
. Solo se puede acceder a este archivo haciendo clic con el botón derecho en el proyecto (debajo de la solución) y seleccionando Unload Project
, después de lo cual se hace clic con el botón derecho en el proyecto descargado y se selecciona Edit LoggingLibrary.csproj
.
Nota:
Para compilar para iOS necesita un equipo Mac en red conectado a Visual Studio como se describe en Introducción a Xamarin.iOS para Visual Studio. Si no tiene un equipo Mac disponible, desactive el proyecto de iOS en el administrador de configuración (paso 3 anterior).
Crear y actualizar el archivo .nuspec
Abra un símbolo del sistema, vaya a la carpeta
LoggingLibrary
que está un nivel por debajo de la ubicación del archivo.sln
y ejecute el comandospec
de NuGet para crear el archivoPackage.nuspec
inicial:nuget spec
Cambie el nombre de este archivo por
LoggingLibrary.nuspec
y ábralo en un editor.Actualice el archivo para que coincida con lo siguiente, reemplazando SU_NOMBRE por un valor adecuado. El valor,
<id>
en concreto, debe ser único en nuget.org (vea las convenciones de nomenclatura descritas en Creación de un paquete). Tenga en cuenta que también debe actualizar las etiquetas de autor y descripción, u obtendrá un error durante el paso de empaquetado.<?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>
Sugerencia
Puede usar -alpha
, -beta
o -rc
como sufijo de la versión del paquete para marcarlo como versión preliminar, consulte Versiones preliminares para obtener más información sobre las versiones preliminares.
Agregar ensamblados de referencia
Para incluir ensamblados de referencia específicos de la plataforma, agregue lo siguiente al elemento <files>
de LoggingLibrary.nuspec
según corresponda para las plataformas admitidas:
<!-- 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>
Nota:
Para reducir los nombres de los archivos DLL y XML, haga clic con el botón derecho en cualquier proyecto, seleccione la pestaña Biblioteca y cambie los nombres de ensamblado.
Adición de dependencias
Si tiene dependencias específicas para implementaciones nativas, use el elemento <dependencies>
con elementos <group>
para especificarlas, por ejemplo:
<!-- 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 ejemplo, lo siguiente establecería iTextSharp como una dependencia para el destino UAP:
<dependencies>
<group targetFramework="uap">
<dependency id="iTextSharp" version="5.5.9" />
</group>
</dependencies>
Archivo .nuspec final
Ahora el archivo .nuspec
final debería ser similar al siguiente, donde debe reemplazar de nuevo SU_NOMBRE con un valor apropiado:
<?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>
Empaquetar el componente
Con el archivo .nuspec
completado haciendo referencia a todos los archivos que se deben incluir en el paquete, está listo para ejecutar el comando pack
:
nuget pack LoggingLibrary.nuspec
Esto generará LoggingLibrary.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 contenido siguiente:
Sugerencia
Un archivo .nupkg
es en realidad un archivo ZIP con una extensión distinta. También puede examinar el contenido del paquete después, cambiando .nupkg
por .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.