Una de las cosas que dejé pendientes cuando publiqué TinyTwitter, mi micro cliente de Twitter, fue preparar el correspondiente paquete NuGet. Aprovechando que es verano y hay pocas ganas de hacer cosas complicadas, desde hace un rato ya se puede instalar TinyTwitter a través de NuGet con el siguiente comando:
PM> Install-Package TinyTwitter
La verdad es que el paquete NuGet no era algo muy necesario porque precisamente uno de los objetivos a la hora de diseñar TinyTwitter era poder usarlo incluyendo un único archivo de código fuente en tu proyecto. No obstante, puede que a alguien le resulte cómodo poder añadirlo desde NuGet.
En cualquier caso, mi objetivo era jugar un poco con la creación de paquetes con NuGet y tengo que reconocer que, pese a que el concepto de NuGet (y los gestores de paquetes en general) no me acaba de convencer, la creación de paquetes es muy sencilla.
Creación de un paquete con NuGet
Es fácil encontrar infinidad de documentación sobre cómo crear un paquete NuGet, pero aun así voy a dejar una guía muy básica para que mi yo del futuro pueda consultarla cuando se le olvide lo que ha hecho hoy.
Un paquete de NuGet no es más que un archivo zip que contiene un fichero con la información del paquete y otros archivos situados en unas carpetas prefijadas. Al instalar un paquete NuGet en un proyecto, se procesan los archivos que hay en cada carpeta de forma diferente:
- En la carpeta lib se incluirán los assemblies que luego serán añadidos como referencias al proyecto en que se instala el paquete NuGet.
- En la carpeta content podemos añadir cualquier tipo de archivo que queramos que se incluya en el proyecto, por ejemplo, ficheros de código fuente, imágenes, etc.
- En la carpeta tools se pueden crear scripts Powershell para automatizar tareas durante la instalación, desinstalación o actualización del paquete.
NuGet se puede ejecutar con parámetros que ayudan a generar estas carpetas a partir de una solución o un proyecto de Visual Studio, pero en el caso de TinyTwitter, que sólo necesita añadir un fichero al proyecto en que se instala, he optado por hacerlo todo manualmente.
Lo primero es generar el archivo de manifiesto con la información del paquete. Para ello ejecutamos:
.\path-to-NuGet\NuGet.exe spec
Nos generá un fichero xml llamado Package.nuspec
que contiene la información del paquete que vamos a crear. Deberemos editar ese fichero para indicar el nombre del paquete, la URL, etc.
La carpeta en la que se encuentre el fichero Package.nuspec
será la carpeta base de nuesto paquete. Eso quiere decir que dentro de ella tendremos que crear las subcarpetas content
, lib
y tools
.
En realidad, sólo hace falta crear aquellas carpetas que vayamos a emplear, así que en nuestro caso nos limitamos a crear la carpeta content
y copiar dentro del fichero TinyTwitter.cs
, que es lo que queremos añadir al proyecto cuando se instale el paquete.
Con esto, ya sólo hace falta generar el paquete usando el siguiente comando:
.\path-to-nuget\NuGet.exe Pack .\path-to-nuspec\Package.nuspec
Eso nos generará en la carpeta actual un fichero llamado PackageName.Version.npukg
.
Hay que andarse con ojo porque al generar el paquete NuGet incluye todo lo que esté en la carpeta que contiene el fichero Package.nuspec
, por lo que si hay versiones anteriores de paquetes o el propio ejecutable de NuGet, se empaquetará también. Se puede usar la opción -Exclude whatever.*
, pero es más fácil si mantenemos limpia esa carpeta y no tenemos que andar excluyendo cosas.
Notas
Para algo como TinyTwitter, que se puede “instalar” copiando y pegando el código en tu proyecto, hacer un paquete NuGet no tiene mucho sentido. De hecho es el tipo de dependencia para el que dudo que sea una buena idea usar un paquete.
Lo interesante es lo fácil que resulta crear paquetes para NuGet. Sé que no es algo novedoso, pero nunca había tenido ocasión de jugar con ello hasta ahora y me ha gustado. Aun así, la prueba que he hecho es tan simple que no estoy muy seguro de que sea representativa.
Supongo que cuando los requisitos de instalación son más complejos y aparecen componentes opcionales, dependencias sobre otros paquetes, versiones distintas para cada framework, etc., esto deja de ser tan fácil.
Para crearlos de forma más sencilla hay una utilidad llamada «NuGet Package Explorer» donde crear los paquetes es coser y cantar. Así crear paquetes con otras dependencias es muy sencillo.
Adrián, lo malo de las dependencias es que tienden a la obsolescencia.