Creando un servidor NuGet propio para distribuir nuestras librerías

Algo que nos puede pasar de forma habitual cuando llevamos un tiempo desarrollando aplicaciones es que tenemos nuestras propias librerías para solucionar problemáticas comunes que se repiten de forma periódica. Básicamente lo que tendremos como resultados son DLLs que estaremos exportando de las librerías y referenciándolas desde los proyectos que las necesiten.

Por supuesto que esto es muchísimo mejor que tener la lógica común duplicada en todas las aplicaciones, pero también tiene sus desventajas, las cuales estarán en mayor o menor medida dependiendo de las características de las librerías y la cantidad de aplicaciones que la usen.

La principal es la distribución manual que debemos hacer de ese archivo para todas las aplicaciones clientes que deban usarlo. Normalmente lo que hacemos es copiarla desde otro proyecto que ya la esté usando. Además hay más problemas, ya que al hacer esto vamos a estar subiendo al repositorio de control de código fuente este archivo binario lo cual no deberíamos hacer. Más problemas tendremos cuando nuestra librería evolucione y tenga distintas versiones: ¿cómo sabemos cuál es la que tiene cada aplicación, la que necesitamos nosotros, si hay una nueva versión disponible, las dependencias que tiene cada una de esas versiones?

Está claro que la solución de todo esto es conocida desde hace tiempo, que es tener un paquete Nuget que encapsule todo esto. Pero necesitamos un servidor que nos provea los paquetes y en determinados casos (sobre todo en entornos empresariales) no podemos subir las librerías que se desarrollen en el repositorio público nuget.org

¿Entonces que hacemos? Sencillo, creemos nuestro servidor Nuget propio.

Básicamente es un sitio ASP.NET corriendo en algún entorno al que podamos acceder (puede estar expuesto a internet, en una intranet o hasta en nuestro equipo) con algunas particularidades. Veamos cómo crearlo:

Creación del servidor Nuget:

Lo primero que haremos es crear un proyecto ASP.NET con la opción de configuración “Vacío” o “Empty“:

NugetServer - CreacionProyecto
Creación del proyecto base
NugetServer - OpcionCreacionProyecto.png
Selección de la opción Empty sobre el template del proyecto

Luego sobre el mismo iremos a la opción de gestionar los paquetes Nuget y buscaremos Nuget.Server, el cual instalaremos:

NugetServer - InstallServerPackage.png

Si no lo queremos hacer por la interfaz visual, directamente ejecutamos el siguiente comando en la consola de gestión de paquetes:

Install-Package NuGet.Server

Una vez que aceptemos la instalación de todas las dependencias asociadas y sus respectivas licencias, nos aparecerá un diálogo advirtiéndonos de que se está queriendo reemplazar el archivo Web.config, lo cual aceptamos:

NugetServer - ReemplazarWebConfig.png

Si ahora ejecutamos nuestra aplicación y todo va bien, deberíamos estar viendo la siguiente pantalla:

NugetServer - ServerEnEjecucion.png

Con sólo unos pasos ya tenemos nuestro servidor Nuget funcionando! 😉

Dentro de la estructura de proyecto que nos crea este paquete, lo que más nos puede interesar es el archivo Web.config. En el mismo podremos configurar a partir de las claves que expone algunos comportamientos del sevidor, cómo el path de donde se tomarán los paquetes, o bien si hay alguna key para que se puedan administrar los paquetes de forma remota:

NugetServer - ConfiguracionesDisponibles.png

Uso del servidor Nuget:

Ahora bien, realizado esto lo que nos queda es configurar Visual Studio para que utilice este servidor como uno de sus orígenes de búsqueda. Para ello iremos a la opción de configuración del gestor de paquetes. Con Visual Studio en inglés deberemos ir a Tools > Nuget Package Manager > Package Manager Settings:
NugetServer - NugetOptions.png

En la pantalla que nos abre vamos a la opción de los orígenes de los paquetes y presionamos la opción de agregar (1). Allí nos creará un elemento nuevo con una Url predeterminada, la cual editaremos en conjunto con el nombre del servidor para una identificación más sencilla (2) y luego presionamos el botón de “Update” para que se reflejen los cambios (3):

NugetServer - ConfigurarOrigenNuget.png

Finalmente, solo nos queda agregar un paquete y probar el funcionamiento. En este caso he usado el paquete generado por la librería .NET Standard vista en el post anterior, la cual nos generará un archivo de extensión nupkg. Si no hacemos ningún cambio adicional sobre la configuración del servidor Nuget, deberemos copiar dicho archivo en la carpeta ~/Packages del mismo. Si todo funciona de forma adecuada, finalizado esto dicho archivo desaparecerá y se creará una carpeta asociada al mismo de forma automática.

Ahora iremos a la opción de gestionar los paquetes Nuget de algún proyecto que necesite utilizarlo y realizaremos la búsqueda del mismo (en nuestro caso se llama StandardClassLibrary). Al realizar la búsqueda sobre todos los orígenes de paquetes veremos que el nuestro está disponible:

NugetServer - UsoPaqueteNuget.png

 

Conclusiones:

Como pudimos ver a lo largo de este post, es realmente muy sencillo el poder crear un servidor Nuget propio. En general todos los que trabajamos en el desarrollo de software (tanto a nivel personal como a nivel empresarial) contamos con ciertas librerías que usamos en diferentes proyectos pero no las podemos/queremos subir a un gestor de paquetes público. Creando un servidor Nuget propio resolvemos este problema sin perder ninguna de las ventajas que nos ofrece como gestor de dependencias:

  • No subimos archivos binarios al servidor de control de código fuente, el paquete se restaurará de forma automática
  • Tenemos disponibles las distintas versiones de nuestras librerías
  • Cada librería tiene sus propias dependencias
  • Podremos ver de forma sencilla cuándo hay una actualización disponible

Espero que les sea útil, gracias por leer!!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s