Nuget, o cómo simplificar la gestión de librerías de código de terceros en nuestras aplicaciones

Durante el desarrollo de proyectos de software, ya sea para Internet o aplicaciones de escritorio, es práctica habitual la utilización de librerías externas, ya sean propias o de terceros, que encapsulan funcionalidades comunes, o simplemente reutilizan código ya desarrollado.

El problema

Hasta ahora, teníamos dos opciones:

  • Librerías de terceros: descargar la librería del autor (o el código fuente y compilarlo) y copiarla en una carpeta local desde la que se referenciaba en el proyecto.

En este caso, además de la posible configuración manual que cada librería puede llevar, y de sus propias dependencias (NHibernate, por ejemplo), la reutilización de la misma en diversos proyectos solía llevar en una duplicidad de librerías, que además dificultaba la actualización posterior a nuevas versiones.

  • Librerías propias: las primeras veces, empiezas como con una librería de terceros, pero al final, acabábamos incluyendo el proyecto de la librería en la solución de .Net del proyecto completo para facilitar las actualizaciones.

En este caso, el problema lo encontramos por un lado en el control de versiones, ya que cada librería suele tener su propio repositorio de Subversion diferente al del proyecto final, en el gran número de proyectos que componen la solución y en la mezcla de tareas de diferentes programadores que trabajan en diferentes librerías, pero que se interfieren en la misma solución.

La solución

Para solucionar estos problemas, Microsoft está desarrollando Nuget, un gestor de paquetes de código abierto que pretende simplificar la incorporación y mantenimiento de librerías de terceros, o propias en una aplicación .Net.

Básicamente Nuget se compone de 3 piezas:

  1. El repositorio de paquetes: lugar centralizado donde se localizan las librerías y sus actualizaciones para su instalación en los proyectos. El repositorio público está en http://www.nuget.org/List/Packages
  2. Los paquetes: mediante un archivo XML podemos definir el contenido de nuestro paquete, e incluso, modificar los archivos de configuración de la solución o ejecutar scripts de Powershell durante la instalación. Dispone de una herramienta para la creación automatizada tanto del archivo de especificación a partir del proyecto, como del paquete en sí: nuget.exe.
  3. El gestor de paquetes: es la extensión de Visual Studio que nos permitirá navegar por el repositorio de paquetes, instalarlos, actualizarlos o desinstalarlos. Para instalarla: http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c

Adicionalmente, se acaba de publicar una aplicación que nos permite explorar el contenido de un paquete, local o remoto: Nuget Package Explorer

Su utilización

La utilización principal de Nuget es para instalar librerías de terceros que se encuentren en el repositorio público. El site de desarrollo del proyecto cuenta con una documentación muy buena (en inglés) para explicar:

También se incluye en la documentación los pasos para crear nuestros propios paquetes, o para utilizar un repositorio local para nuestros propios paquetes, sin necesidad de publicarlos en el repositorio público.

Además de la propia documentación, son sitios de referencia también los blogs de los propios desarrolladores involucrados en Nuget:

Phil Haack (@haacked): http://haacked.com/tags/NuGet/default.aspx
David Ebbo (@davidebbo): http://blog.davidebbo.com/search/label/NuGet

Conclusiones

Nuget nos simplifica la tarea de instalar y mantener actualizadas las librerías de terceros que usamos en nuestras aplicaciones, automatizando el proceso y manteniendo un repositorio centralizado de las mismas.

Además, nos permite crear nuestros propios paquetes, que pueden incluir las librerías propiamente dichas, contenido estático, código fuente, transformaciones para archivos de configuración o ejecutar scripts de powershell que realicen tareas sobre la solución.

En futuros posts, veremos un ejemplo de cómo montar un repositorio local de Nuget, y publicaremos en él un paquete de ejemplo que usaremos en otro proyecto.