Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 17 de marzo de 2020
.NET Core Hace unos días han anunciado la disponibilidad de una herramienta que os puede interesar si, como un servidor, acumuláis un gran número de versiones del SDK y runtimes de .NET Core que no váis a necesitar, algo muy propio de ese Diógenes digital que todos llevamos dentro ;)

El estado actual de acumulación de SDKs podéis conocerlo muy fácilmente desde línea de comandos utilizando la orden dotnet --list-sdks:
C:\>dotnet --list-sdks
1.1.11 [C:\Program Files\dotnet\sdk]
2.1.202 [C:\Program Files\dotnet\sdk]
2.1.503 [C:\Program Files\dotnet\sdk]
2.1.504 [C:\Program Files\dotnet\sdk]
2.1.505 [C:\Program Files\dotnet\sdk]
2.1.507 [C:\Program Files\dotnet\sdk]
2.1.508 [C:\Program Files\dotnet\sdk]
2.1.509 [C:\Program Files\dotnet\sdk]
2.1.511 [C:\Program Files\dotnet\sdk]
2.1.602 [C:\Program Files\dotnet\sdk]
2.1.604 [C:\Program Files\dotnet\sdk]
2.1.700 [C:\Program Files\dotnet\sdk]
2.1.701 [C:\Program Files\dotnet\sdk]
2.1.800-preview-009696 [C:\Program Files\dotnet\sdk]
2.1.801 [C:\Program Files\dotnet\sdk]
2.1.802 [C:\Program Files\dotnet\sdk]
2.2.102 [C:\Program Files\dotnet\sdk]
2.2.105 [C:\Program Files\dotnet\sdk]
2.2.202 [C:\Program Files\dotnet\sdk]
2.2.203 [C:\Program Files\dotnet\sdk]
2.2.204 [C:\Program Files\dotnet\sdk]
3.0.100-preview8-013656 [C:\Program Files\dotnet\sdk]
3.0.100-preview9-014004 [C:\Program Files\dotnet\sdk]
3.0.100 [C:\Program Files\dotnet\sdk]
3.1.100 [C:\Program Files\dotnet\sdk]
3.1.101 [C:\Program Files\dotnet\sdk]
3.1.102 [C:\Program Files\dotnet\sdk]

C:\>_
En mi caso, tengo aún por ahí el SDK de .NET Core 1.x, un par de decenas de .NET Core 2.x, y algunas previews, pero los he visto mucho peores ;) Obviamente, salvo dos o tres versiones que quizás me interesen porque tengo aplicaciones que aún no he migrado, el resto ocupan en mi equipo un espacio considerable sin motivo, más de 5GB, pues cada SDK puede pesar entre 150 y 200 Mb.

Algo parecido ocurre con las versiones preinstaladas de los runtimes del framework, que podemos consultar con la orden dotnet --list-runtimes:
C:\>dotnet --list-runtimes
Microsoft.AspNetCore.All 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0-preview8.19405.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0-preview9.19424.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 1.0.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 1.1.10 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.0.0-preview8-28405-07 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.0.0-preview9-19423-09 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.0.0-preview8-28405-07 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]      Microsoft.WindowsDesktop.App 3.0.0-preview9-19423-09 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]      Microsoft.WindowsDesktop.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 3.1.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 3.1.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

C:\>_
El espacio ocupado por los runtimes no es tan grande como en el caso de los SDKs, pero aún así, en mi equipo subían de los 1.2Gb.

Ciertamente, podríamos eliminar gran parte de esta basura acudiendo a la configuración del sistema y desinstalando versión a versión, pero puede ser una labor tediosa si tenéis mucho acumulado.

La nueva herramienta dotnet-core-uninstall

La herramienta de línea de comandos dotnet-core-uninstall permite desinstalar estos elementos de forma más sencilla y rápida. Para instalarla, lo primero es acudir al repositorio del proyecto y, en el caso de Windows, descargar el archivo .MSI que encontraréis en la release más reciente; si tenéis un Mac, debéis seguir las instrucciones que aparecen en esa misma página.
Ojo: esta herramienta no funciona en Linux :(
Tras la correspondiente instalación, ya podremos utilizar la orden desde la consola.
C:\>dotnet-core-uninstall
Required command was not provided.

dotnet-core-uninstall:
  Remove specified .NET Core SDKs or Runtimes. This tool can only uninstall items that were installed 
  using Visual Studio, .NET Core SDK, or Runtime installers. By default, this tool does not 
  uninstall versions that might be needed for Visual Studio. Read the documentation for the 
  .NET Core Uninstall Tool at https://aka.ms/dotnet-core-uninstall.

Usage:
  dotnet-core-uninstall [options] [command]

Options:
  --version    Display version information

Commands:
  list                         List .NET Core SDKs or Runtimes that can be removed with this tool.
  whatif, dry-run <VERSION>    Display .NET Core SDKs and Runtimes that will be removed.
  remove <VERSION>             Remove the specified .NET Core SDKs or Runtimes.

C:\>_
La misma ayuda ya nos da una idea clara de lo que podemos hacer con esta herramienta. Si probamos con dotnet-core-uninstall list veremos la lista de SDK, runtimes y hosting bundles que pueden ser desinstaladas:
C:\>dotnet-core-uninstall list

This tool can not uninstall versions of the runtime or SDK that are 
    - SDKs installed using Visual Studio 2019 Update 3 or later.
    - SDKs and runtimes installed via zip/scripts.
    - Runtimes installed with SDKs (these should be removed by removing that SDK).
The versions that can be uninstalled with this tool are:

.NET Core SDKs:
  3.1.102      x64    [Used by Visual Studio. Specify individually or use —-force to remove]
  3.0.100      x64
  2.2.204      x64    [Used by Visual Studio 2019. Specify individually or use —-force to remove]
  2.2.203      x64
  2.2.105      x64    [Used by Visual Studio 2017. Specify individually or use —-force to remove]
  2.2.102      x64
  2.1.802      x64    [Used by Visual Studio 2019. Specify individually or use —-force to remove]
  2.1.801      x64
  2.1.800-preview-009696  x64
  2.1.701      x64
  2.1.700      x64
  2.1.604      x64
  2.1.602      x64
  2.1.512      x64    [Used by Visual Studio 2017. Specify individually or use —-force to remove]
  2.1.511      x64
  2.1.509      x64
  2.1.508      x64
  2.1.507      x64
  2.1.505      x64
  2.1.504      x64
  2.1.503      x64
  2.1.202      x64    [Used by Visual Studio. Specify individually or use —-force to remove]
  1.1.11       x64    [Used by Visual Studio. Specify individually or use —-force to remove]

.NET Core Runtimes:

ASP.NET Core Runtimes:

.NET Core Runtime & Hosting Bundles:

C:\>_
En mi caso, podéis ver que no aparecen runtimes ni bundles. Esto es así porque todos ellos fueron instalados con su correspondiente SDK, y no podrían ser desinstalados de forma independiente: al desinstalar el SDK, los runtimes asociados correrán la misma suerte.

Para desinstalar un SDK basta con ejecutar la orden dotnet-core-uninstall remove <VERSION> --sdk, como por ejemplo:
C:\>dotnet-core-uninstall remove 2.1.503 --sdk
The following items will be removed:
  Microsoft .NET Core SDK 2.1.503 (x64)

To avoid breaking Visual Studio or other problems, read https://aka.ms/dotnet-core-uninstall.

Do you want to continue? [Y/n] y
Uninstalling: Microsoft .NET Core SDK 2.1.503 (x64).

C:\>_
Si quisiéramos eliminar otro tipo de elementos podríamos indicarlo mediante los flags --runtime o --hosting-bundle. Asimismo, el comando soporta un gran número de opciones adicionales para poder realizar algunas de estas operaciones de forma masiva:
  • --all elimina todo
  • --all-previews elimina todas las versiones preview
  • --all-previews-but-latest elimina todas las versiones preview excepto la más reciente
  • --all-but <VERSION> elimina todo excepto la versión indicada
  • --all-lower-patches elimina todas las versiones que disponen de un parche superior
  • Podéis ver muchos otros flags en la documentación de la herramienta, muchos de ellos destinados a eliminar masivamente elementos que ya no necesitemos.
Como podéis imaginar, con estas opciones destinadas a la desinstalación masiva es fácil dispararse en un pie. Para evitarlo, existe una opción llamada "whatif" o "dry-run" que muestran por consola los elementos que serían eliminados si ejecutásemos la instrucción remove. Es importante utilizarla antes de desinstalar nada para comprobar que estamos haciéndolo correctamente:
C:\>dotnet-core-uninstall whatif --all-previews --sdk
*** DRY RUN OUTPUT
Specified versions:
  Microsoft .NET Core SDK 2.1.800 - preview (x64)
*** END DRY RUN OUTPUT

C:\>dotnet-core-uninstall whatif --all-but-latest --sdk
*** DRY RUN OUTPUT
Specified versions:
  Microsoft .NET Core SDK 3.0.100 (x64)
  Microsoft .NET Core SDK 2.2.203 (x64)
  Microsoft .NET Core SDK 2.2.102 (x64)
  Microsoft .NET Core SDK 2.1.801 (x64)
  Microsoft .NET Core SDK 2.1.800 - preview (x64)
  Microsoft .NET Core SDK 2.1.701 (x64)
  Microsoft .NET Core SDK 2.1.700 (x64)
  Microsoft .NET Core SDK 2.1.604 (x64)
  Microsoft .NET Core SDK 2.1.602 (x64)
  Microsoft .NET Core SDK 2.1.511 (x64)
  Microsoft .NET Core SDK 2.1.509 (x64)
  Microsoft .NET Core SDK 2.1.508 (x64)
  Microsoft .NET Core SDK 2.1.507 (x64)
  Microsoft .NET Core SDK 2.1.505 (x64)
  Microsoft .NET Core SDK 2.1.504 (x64)
*** END DRY RUN OUTPUT

C:\>_
En la documentación de la herramienta hacen las siguientes advertencias:
  • Hay que tener en cuenta que podríais eliminar versiones requeridas de forma local por un global.json. En este caso, deberíais volver a instalar el SDK desde la página de descargas de .NET Core.
  • De la misma forma, habría que reinstalar si eliminamos runtimes requeridos por aplicaciones desplegadas en nuestro equipo como framework dependent.
  • También podríamos eliminar por error versiones requeridas por Visual Studio; en este caso, deberemos reparar la instalación.
Publicado en Variable not found.

2 Comentarios:

MontyCLT dijo...

¿Qué nos aporta exactamente esta herramienta frente a desinstalarlas desde el listado de programas de Windows?

https://i.imgur.com/E1wPNzs.png

José María Aguilar dijo...

Hola!

Tiempo :)

Usando esta herramienta puedes hacerlo de forma masiva, sin tener que ir desinstalando una a una. En casos donde hay una acumulación importante, te ahorrará un buen rato.

Saludos!