Mantenimiento de Visual Studio, la caché de NuGet y cómo liberar espacio en disco
Introducción
En esta entrada, quiero compartir un truco que considero muy interesante y que suele quedar en el olvido.
Muchos leerán esto y se sorprenderán porque lo desconocían.
Otros que lo lean, caerán en la cuenta de que hace mucho tiempo que no lo ponían en práctica.
Y otros, serán los que asiduamente suelen realizar este tipo de buenas prácticas.
Poniéndonos en situación
Lo habitual cuando trabajamos con Visual Studio (da igual la versión y si es .NET Framework o .NET Core) es que agreguemos paquetes NuGet a nuestros proyectos.
Esta tarea que parece inocente, lleva por debajo una serie de procesos que hace que nuestro disco duro vaya acumulando paquetes y versiones de forma impulsiva y casi sin que nos demos cuenta.
Y es que esta casi automática tarea, pasa muchas veces desapercibida para la mayoría de los programadores.
Imaginemos por lo tanto, que llevamos varios meses trabajando de forma intensa en varios proyectos de tamaño medio/grande.
Después de ese tiempo es probable que lleguemos a acumular fácilmente varias gigas de paquetes NuGet (y no exagero ni un ápice).
Flujo de trabajo con repositorios de paquetes NuGet
Dentro del flujo de lo que es el proceso habitual que un programador realiza entre Visual Studio, sus proyectos y NuGet, se produce un primer paso de verificar que el paquete y versión que se quiere usar ya se ha descargado previamente o no.
Si nunca se ha descargado en el entorno, se descargará en local dentro de una carpeta packages que normalmente encontraremos en C:\Users\<user>\.nuget\packages
Una vez copiado el paquete ahí, se pasará al proyecto.
Así, si el paquete ya se descargó previamente, nos evitamos el trasiego de ida y vuelta contra el repositorio de paquetes NuGet ganando tiempo.
Esos paquetes almacenados es lo que se denomina en el argot de Visual Studio como NuGet Cache.
En resumen.
A lo largo del tiempo, podemos llegar a acumular grandes cantidades de información, muchas veces obsoleta ya o sin casi uso.
¿Debemos limpiar la caché de NuGet?
Ahora bien, ¿es necesario eliminar esos paquetes?.
Pues aquí depende del programador.
Cada uno debe decidir que hacer.
El problema es que muchos desarrolladores desconocen la existencia de este flujo y de esta carpeta, y nunca se han planteado esta pregunta.
Yo por lo general, recomiendo liberar espacio cada cierto tiempo.
En mi caso soy de esas personas que trato de tener los proyectos al día, con las últimas versiones de sus paquetes.
Así que pasado un tiempo, es muy posible que dentro de esa carpeta tenga paquetes con bastantes versiones diferentes descargadas, mayoritariamente obsoletas ya, que no vaya a utilizar prácticamente nunca más.
Ir carpeta a carpeta buscando las versiones más antiguas o hacer un script que lo haga, no me parece especialmente útil.
Si quieres hacer un poco el friki (o cafre) puedes «jugar» a hacer esto, pero en mi caso prefiero hacer un delete and clean en toda regla.
Cómo limpiar el entorno
Para realizar esta tarea tenemos tres posibilidades.
Una manual.
Acudir directamente a la carpeta que comentaba antes C:\Users\<user>\.nuget\packages y seleccionar todos los paquetes para a continuación eliminarlos.
Otra automática y quizás más sencilla o cómoda.
Si tenemos Visual Studio 2017 ó Visual Studio 2019, abriremos las opciones de herramientas (Tools > Options) e iremos al bloque de opciones NuGet Package Manager.
Dentro del bloque, encontraremos un botón en la parte inferior con el texto Clear All NuGet Cache(s).
Haciendo clic en este botón, realizaremos la misma acción de seleccionar todos los paquetes y eliminarlos, aunque más directo.
Una con dotnet.exe.
Pero también tenemos la posibilidad de ejecutar dotnet.exe para realizar toda esta operativa.
Para limpiar la cache 3.x+ => dotnet nuget locals http-cache –clear
Para limpiar la carpeta de los paquetes globales => dotnet nuget locals global-packages –clear
Para limpiar la caché temporal => dotnet nuget locals temp –clear
Para limpiar la caché de los plugins => dotnet nuget locals plugins-cache –clear
Para limpiar todas las cachés => dotnet nuget locals all –clear
Otras consideraciones
Otra consideración a tener en cuenta dentro de la gestión de paquetes de NuGet, es que podemos tener configurados repositorios de paquetes de terceros (no sólo de nuget.org).
En ese caso, es posible incluso que estemos en un proyecto en el que necesitemos acceder a esos paquetes concretos y que una vez finalizado el proyecto, ya no necesitemos conectarnos a ese repositorio nunca más.
Lo habitual es, no sólo que tendremos megabytes de información descargados en la caché de NuGet, sino que también habremos configurado el Package Source para acceder a esos repositorios.
Por si no lo sabes, hay otro directorio «oculto» para los desarrolladores de Visual Studio en el que se almacena información adicional de todos los repositorios de paquetes.
No suelen tener un tamaño tan considerable como el de la caché de NuGet, pero sí conviene conocerlo.
Encontraremos ese directorio en C:\Users\<user>\AppData\Local\NuGet\v3-cache
Si no vamos a usar nunca más un repositorio, lo natural es elminarlo de la configuración de las fuentes de paquetes dentro de Visual Studio, así que si hacemos esto, es posible que queramos eliminar también la carpeta del repositorio para ganar algo de espacio.
Luego quedaría una vez más, la tarea que indicaba anteriormente de limpiar la caché para redondear la jugada, pero esto ya si queremos.
Luego ya, como colofón, un poquito de fragmentación de disco después de realizar estas operaciones ayudará también a mantener nuestro sistema un poco más ágil y rápido.
Espero que estos pequeños consejos te ayuden a ganar algo de espacio en tu disco duro y a mantener un poco más limpio tu entorno de desarrollo.
Happy Coding!