dotnetup en preview: instala un SDK por usuario sin romper global.json
Prueba dotnetup sin mezclar instalaciones: entiende global.json, canales, PATH y la copia de .NET que realmente usa cada proceso.
22 de octubre de 2026 · Leopoldo Benavente Cadena · 6 min de lectura
Instalar otro SDK de .NET no debería cambiar silenciosamente el que usa tu repositorio. El problema aparece cuando conviven tres decisiones: dónde se guardan los archivos, qué versión exige global.json y qué host encuentra el proceso mediante PATH; DOTNET_ROOT puede orientar a un apphost hacia una instalación y sus runtimes, pero no selecciona universalmente el SDK.
dotnetup intenta ordenar esas decisiones, pero sigue en vista previa pública. Microsoft lo presenta como un gestor de toolchains a nivel de usuario para instalar, actualizar y retirar SDK y runtimes sin escribir en una carpeta administrada por el sistema. Es una opción para probar versiones lado a lado, no una sustitución GA de Visual Studio, de los instaladores o de la administración de una máquina de producción.
Primero separa instalación, selección y proceso
Piensa en tres capas:
- Instalación: los SDK y runtimes que
dotnetupconserva en su raíz administrada. En Windows, la documentación sitúa por defecto esa raíz bajo%LOCALAPPDATA%\\dotnetup\\dotnet; no es la copia deProgram Files\\dotnet. - Selección del repositorio: el
global.jsonmás cercano al directorio desde el que se trabaja puede expresar una versión y unrollForward.dotnetup sdk installusa ese archivo si no recibe un canal explícito. - Proceso:
dotnet --infose ejecuta con el hostdotnetque resolvió elPATH.DOTNET_ROOTpuede indicar a un apphost dónde buscar la instalación y los runtimes, pero no sustituye la resolución del SDK del host.dotnetup dotnet -- --infoelige explícitamente el host administrado. Un proceso que no cargue la configuración dedotnetuppuede seguir usando la instalación de máquina.
Por eso dotnetup list y dotnet --info responden preguntas distintas: el primero muestra requisitos e instalaciones que el gestor sigue; el segundo muestra qué host y SDK encontró el proceso actual.
Prueba el caso global.json en una carpeta temporal
No cambies el repositorio real. Una carpeta temporal de laboratorio evita editarlo, pero no aísla la instalación a nivel de usuario: dotnetup seguirá usando su raíz administrada y cualquier cambio de entorno tendrá el alcance documentado. Guarda en ella este archivo, que usa el ejemplo documentado por Microsoft:
{
"sdk": {
"version": "10.0.103",
"rollForward": "latestPatch"
}
}Desde esa carpeta, inspecciona primero la versión del gestor y su inventario; después instala el requisito que se deriva del archivo:
dotnetup --version
dotnetup list
dotnetup sdk install
dotnetup list
dotnetup dotnet -- --infoLa documentación define que latestPatch convierte 10.0.103 en el canal 10.0.1xx. Si usas latestFeature, el canal derivado es 10.0; latestMinor deriva 10; latestMajor deriva latest. Los valores disable, patch, feature, minor y major se tratan como una exigencia exacta. Una exigencia exacta queda fijada y no avanza con dotnetup update.
Si no hay un global.json en la ruta buscada, dotnetup sdk install usa latest. Si el archivo más cercano está mal formado, el comando falla en lugar de saltar a uno más lejano. Esa regla es útil para reproducibilidad: corrige el archivo que realmente gobierna el repositorio, no otro que casualmente esté en un directorio padre.
No confundas forwarding con modificar el PATH
La instalación y la configuración del entorno son operaciones distintas. Para un primer laboratorio, usa el modo none y ejecuta el host administrado mediante forwarding:
dotnetup env set none --dotnetup-on-path true
dotnetup env show
dotnetup dotnet -- --infoLa forma --dotnetup-on-path true modifica solo el acceso al ejecutable dotnetup en PATH: no añade el dotnet administrado a PATH ni establece DOTNET_ROOT. Si ya puedes invocar dotnetup por otra ruta y quieres evitar incluso ese cambio, usa --dotnetup-on-path false. El cambio del acceso es reversible con dotnetup env clear; no toca el repositorio ni cambia la selección del dotnet normal. Así puedes comparar ese resultado con el entorno normal sin convertir la preview en la autoridad de todo el equipo.
El modo shell escribe la configuración en el perfil del shell y afecta a procesos iniciados desde una terminal nueva:
dotnetup env set shell --shell pwsh
dotnetup env script --shell pwsh | Invoke-Expression
dotnet --infoEn Bash o Zsh cambia el valor de --shell según la documentación. El modo everywhere solo está disponible en Windows: modifica el PATH del sistema y el DOTNET_ROOT del usuario, puede requerir elevación y hace que la instalación administrada tenga precedencia sobre la copia de máquina. Es el modo con más alcance, así que no lo uses como primer experimento.
Para comprobar la ruta real, usa where.exe dotnet en Windows o command -v dotnet en Unix; en PowerShell también puedes usar Get-Command dotnet. Compara después con dotnetup dotnet -- --info. Si Visual Studio está instalado, recuerda que mantiene su propia copia de .NET a nivel de máquina; dotnetup no la actualiza ni la elimina.
Cuando quieras deshacer la configuración del entorno, dotnetup env clear retira ese cableado sin desinstalar .NET. Revisa antes dotnetup env show y abre una terminal nueva cuando el modo haya cambiado el perfil.
Actualiza canales, no versiones por accidente
dotnetup guarda el requisito solicitado separado de la versión concreta instalada. Un canal rodante puede resolver una versión más nueva:
dotnetup update
dotnetup list
dotnetup list --format jsonTambién puedes acotar la operación a dotnetup sdk update, a dotnetup sdk update --all o a dotnetup runtime update. Una versión exacta se omite porque fue solicitada explícitamente. La actualización del gestor es otra operación: dotnetup self update no es lo mismo que actualizar los SDK y runtimes seguidos.
Si una actualización termina correctamente, dotnetup puede retirar componentes que ningún requisito restante necesita. Antes de automatizar una limpieza, guarda dotnetup list y confirma qué requisitos siguen registrados. La documentación indica que una versión permanece si otro requisito todavía la comparte.
Para escribir una versión resuelta dentro de global.json, usa solo el paso explícito y revisable:
dotnetup sdk install --update-global-jsonEse comando cambia el archivo del repositorio. Revisa el diff y decide si debe entrar en control de versiones; no lo incluyas en el primer laboratorio si solo quieres instalar lo que el archivo ya pide.
Decide si dotnetup encaja
Es razonable probarlo cuando necesitas SDKs lado a lado, instalaciones por usuario, canales preview/daily o una instalación guiada por global.json. Mantén el instalador, un gestor de paquetes o Visual Studio cuando necesitas una instalación generalmente disponible y soportada para una máquina de producción, una copia de máquina o una política centralizada de dispositivos.
No presentes latest, 10.0 o 10.0.1xx como versiones eternas: son intenciones que pueden resolver otra versión en el siguiente ciclo. Para builds reproducibles conserva el global.json, registra la versión resuelta y revisa cualquier diff antes de actualizar. La vista previa puede cambiar comandos, opciones y comportamiento antes de disponibilidad general; una prueba aislada hoy no es una promesa de compatibilidad futura.
Fuentes primarias: anuncio de dotnetup en .NET Blog, visión general de dotnetup, inicio y modos de acceso, configurar el acceso al .NET administrado, instalar el SDK requerido por global.json, actualizar instalaciones seguidas y cuándo usar dotnetup.
Comentarios