[Tip] Usar NuGet sin tener que subir los paquetes a nuestro repositorio de código fuente

Creo que es una de las pegas que más he comentado con la gente que usa NuGet, es decir, cuando usas NuGet en tus proyectos, se crea una carpeta packages donde se descargan todas las librerías que usas en tus proyectos:

image

Y es un verdadero engorro tener que estar subiendo todo el contenido de esta carpeta al control de código fuente por varias razones:

  • Tamaño: Sí tenemos muchas referencias a librerías, herramientas… esta carpeta hará crecer considerablemente el tamaño de nuestros repositorios y cada vez que lo clonemos tendremos que descargarnos todos los paquetes. Además sí el espacio nos cuesta dinero, estaremos pagando de más innecesariamente.
  • Problemas con la actualización de paquetes al tener todo bajo el control de código fuente.

Pues a partir de la nueva versión de NuGet podemos evitar todos estos problemas ¿Cómo? A continuación te lo cuento:

Una vez abierta tu solución en Visual Studio 2010, selecciona tu *.sln y pulsa botón derecho:

image

Pulsamos sobre Enable NuGet Package Restore y nos aparece esta ventana emergente en la que se nos informa que los paquetes de NuGet van a ser añadidos/restaurados cuando se compile la solución:

image

¿Y como lo hace?

Pues si aceptamos, se crea una nueva carpeta de solución llamada .nuget:

image

que contiene el ejecutable de NuGet.exe y un archivo de llamado NuGet.targets que contiene una secuencia de commandos de MSBuild, en la que busca en cada proyecto de la solución el archivo packages.config para chequear si los paquetes están descargados o no, y si no están los descarga.

El contenido del archivo packages.config es muy sencillo. Es un xml donde se indica el nombre de paquete y la versión que se está utilizando:

image

Ahora vamos a ver como funciona todo esto. Lo primero es borrar nuestra carpeta de packages.

Una vez borrada, compilamos nuestra solución y echamos un vistazo al Output:

image

Si os fijáis, se ha descargado todos los paquetes que estaban en el fichero packages.config y una vez descargados ha compilado la solución.

Sí lo volvemos a ejecutar, chequea que existen y no se los descarga:

image

Si no usas TFS como control de código fuente y como es mi caso usas Mercurial, puedes usar el archivo .hgignore (Este archivo sirve para indicar las extensiones de archivos y directorios que no quieres que esten bajo el control de código fuente) para indicar que la carpeta packges no se suba al servidor centralizado. Añadimos la siguiente entrada:

[Pp]ackges/

Editado: Como bien comenta Unai hay que decirle que el directorio .nuget lo suba al respositorio con el exe y con el msbuild target para que todo esto funcione, porque seguramente tengamos una entrada para que no suba los exe y entonces nos falle al compilar 🙂

Así pues con este pequeño flujo de trabajo, cualquier programador o el mismo servidor de integración continua podrá descargar los paquetes necesarios para compilar satisfactoriamente la solución sin tener que subirlos al control de código fuente.

Un saludo.

6 comentarios en “[Tip] Usar NuGet sin tener que subir los paquetes a nuestro repositorio de código fuente”

  1. Luis, acuerdate tambien de decirle al .hignore que si que suba nuget.exe, generalmente los .exe están ignorados pero en este casi lo necesitas para en la compilación hacer la descarga para quien no tenga los paquetes.

    unai

  2. Buen apunte. Me lo guardo porque precisamente el otro día estábamos hablando de lo “feo” que era tener que estar subiendo toda esa estructura al repositorio de código de fuente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *