Empecemos por el principio:
Dispongo de 2 equipos con Visual Studio 2015, y un tercero con Visual Studio 2017. Si, se que debería pasar todos a 2017, pero me resisto: Visual Studio 2015 funciona bien, y mi querido project.json en core me gusta, bastante.
El caso es que acostumbro a intercambiar los equipos con 2015 a la hora de programar, manteniendo el código en una carpeta sincronizada en OneDrive, por lo que siempre está al día en ambos aunque no haya hecho commit/push a mi repositorio remoto (llamadme temerario).
Más de una vez, en uno de los cambios de equipo, me he encontrado con un error a la hora de abrir una solución que contenga proyectos .NET Core, y además no pudiendo compilar a partir de ese momento ningún proyecto .NET Core.
El error al cargar la solución es el siguiente:
Al compilar este:
Parece que hay algún problema en el SDK de .NET Core o bien en el tooling para Visual Studio 2015. Siempre en el pasado lo he arreglado desinstalando SDK's y tooling e reinstalando el tooling para Visual Studio de nuevo (que también instala el SDK). Esta vez sin embargo quiero ver que genera el error para resolverlo y no volver a sufrirlo (espero).
Vamos a empezar viendo que tenemos instalado:
- La versión del runtime de .NET Core, ejecutando el comando dotnet. Tengo el runtime 1.1.0
- La versión del CLI, con dotnet --version. Tengo la versión 1.0.4 del CLI
- La versión del SDK (que debería ser la misma que la del CLI), con dotnet --info. Efectivamente es el 1.0.4, como el CLI
- ¿Hay otros SDK's instalados?, Para ello miramos directamente en la carpeta ProgramFiles\dotnet\SDK
Vemos que dispongo de dos SDK’s,un preview y la versión 1.0.4. Aprovecho a recordar que .NET Core siempre usa la versión más alta que tenga disponible.
- ¿Qué dice Windows que tenemos instalado? Miramos a Agregar/Quitar programas
Como se ve tengo dos SDK, uno preview y el 1.04, esto coincide con lo que vi directamente en disco. Además tengo las tools para Visual Studio, que son las que parece no funcionan.
¿Como lo comprobamos? Compilando desde línea de comandos con dotnet build
Vemos que no funciona, y para esto no interviene Visual Studio, ya que estoy compilando con el CLI.
Primera pista: el problema está en el SDK
Diferencia entre SDK y tools:
Aquí se puede ver: https://docs.microsoft.com/en-us/dotnet/core/sdk
El SDK nos da:
- Las herramientas de línea de comandos (CLI)
- El runtime y librerías necesarias para compilar
En cuanto al tooling para Visual Studio, nos permite trabajar con .Net Core en Visual Studio, añadiendo plantillas de proyecto y permitiendo compilar, depurar, etc...
Primer intento: reinstalamos el SDK
Vamos a irnos a la página de descargas de core (https://www.microsoft.com/net/download/core) y ver que tenemos disponible
Allí podemos descargar el último SDK (actualmente descarga el SDK 1.0.4) y el tooling para Visual Studio, que para 2015 es un preview (nunca dejó de serlo y ya no lo hará).
Voy a descargar el SDK y reinstalarlo, ya dijimos que todo apunta a que es el problema. Realmente al ejecutar el instalador ve que ya lo tengo y me pide reparar:
Después de hacerlo... nada, dotnet build sigue fallando, y la compilación desde Visual Studio también.
Segundo intento: reinstalamos el tooling para visual studio
De nuevo se encuentra en la página de descargas de .NET Core (https://www.microsoft.com/net/download/core)Después de hacerlo (de nuevo detectó que ya estaba instalado)... sigue fallando la compilación
Tercer intento, desinstalamos todo y empezamos de cero
Después de desinstalar todo solo voy a instalar las tools de Visual Studio 2015
Ahora puedo compilar, tanto desde Visual Studio como con dotnet build, Por fin… el paciente está estable
Vamos a ver como tenemos todo ahora (que versiones):
- Versión del runtime de .NET Core, ejecutando el comando dotnet. Tengo el runtime 1.0.1
- Versión del CLI, con dotnet --version. Tengo la versión 1.0.0-preview2-003131 del CLI
- Versión del SDK (que debería ser la misma que la del CLI), con dotnet --info. Efectivamente es el 1.0.0-preview2-003131, como el CLI
- ¿Hay otros SDK's instalados?, Para ello miramos directamente en la carpeta ProgramFiles\dotnet\SDK
- ¿Qué dice Windows que tenemos instalado? Miramos a Agregar/Quitar programas. Tenemos un Sdk preview y el tooling preview
Como decía el paciente esta estable, pero claro, solo dispongo de .NET Core 1.0.x , no tengo opción de 1.1 (de 2.0 ni hablamos , eso será otro post). Y lo malo, mi aplicación, que ha compilado bien, no debería poder ejecutar ya que su target es .NET Core 1.1.
Como esperaba, obtengo un bonito error al tratar de ejecutar. Me indica que el runtime .NET Core 1.1 no esta disponible
Es curioso, aunque no puedo ejecutar, puedo compilar .NET Core 1.1, sin que haya runtime ni SDK apropiado en mi equipo
Ahora vamos a instalar un SDK reciente,que nos permita trabajar con .NET Core 1.1. La página de descargas me ofrece el SDK 1.0.4, que incluye soporte para .NET Core 1 y 1.1. Lo voy a instalar
Una vez finalizada la instalación, problemas: A partir de ese momento... si intento compilar de nuevo obtengo errores! Se ha vuelto a romper.
Vamos a ver de nuevo que situación tenemos:
- Versión del runtime de .NET Core, ejecutando el comando dotnet. Tengo el runtime 1.1.0
- Versión del CLI, con dotnet --version. Tengo la versión 1.0.4 del CLI (como en el punto de partida)
- Versión del SDK (que debería ser la misma que la del CLI), con dotnet --info. Efectivamente es el 1.0.4, como el CLI
- ¿Hay otros SDK's instalados?, Para ello miramos directamente en la carpeta ProgramFiles\dotnet\SDK
Vemos que si, ha aparecido el SDK 1.0.4
- ¿Qué dice Windows que tenemos instalado? Miramos a Agregar/Quitar programas
Tenemos lo esperado: Tooling de Visual Studio 2015 y dos sdk’s, el instalado por el tooling y el mas reciente (1.0.4)
¿Qué ha pasado?
Pues parece que el SDK 1.0.4 no trae soporte para Visual Studio 2015, o más bien para los ficheros de proyecto tipo json.
Con el lanzamiento de Visual Studio 2017, Microsoft por fin liberó un SDK en RTM (versión >= 1), que como ya soportaba el nuevo (¿nuevo?) fichero de proyecto csproj “mataba” el soporte al fichero de proyecto tipo json.
Fijaos, fue aquí:
¿Como lo arreglamos?
Ya hemos mencionado que siempre se usa por defecto el SDK superior disponible, pero tenemos que hacer que el SDK a usar sea el que queramos, es decir uno con soporte a project.json.¿Cómo se hace? Debemos crear un fichero llamado global.json, ubicado en una carpeta anterior a la que contiene el fichero project.json (y por tanto nuestro proyecto) y allí indicar el SDK a usar. En mi caso será algo así:
{
"projects": [ "1.Queues", "2.Topics" ],
"sdk": {
"version": "1.0.0-preview2-003131"
}
}
Como veis indicamos el SDK y las carpetas dentro de las cuales queremos que aplique. En mi caso las dos carpetas donde tengo proyectos. Indicar las carpetas no es obligatorio, podríamos solo indicar el sdk, que aplicaría a todo el árbol de subdirectorios.
Una vez que tenemos el fichero todo vuelve a la normalidad, y podemos compilar sin problema, además de ejecutar aplicaciones con .NET Core 1.1
Espero que os sea de utilidad!
Recursos:
- Post de John Hilton hablando sobre esto, que fue escrito cuando salió .NET Core 1.1: https://jonhilton.net/2017/04/17/making-sense-of-the-different-versions-of-net-core-runtime-and-sdk/
- Historial de versiones del runtime y el SDK de .NET Core: https://github.com/dotnet/core/blob/master/release-notes/download-archive.md
- Documentación oficial sobre el fichero global.json: https://docs.microsoft.com/hu-hu/dotnet/core/tools/global-json
- Mas información sobre el global.json: https://stackoverflow.com/questions/34791682/explanation-of-the-projects-section-in-global-json-in-asp-net-5
- Entrada de Jonathan Mezach acerca del versionado en :NET Core: https://blogs.infosupport.com/net-core-versioning/
Acho, y eso que el .NET Core ese iba a simplificar las cosas.
ResponderEliminarYo tengo un problema similar con C++ nativo que es pero: exactamente la misma instalación en las dos maquinas, una compila, la otra no porque no puede encontrar el compilador de WSDL a C++, compilador que está instalado. ¿Mi solución? Mandar a tomar por culo el segundo ordenador y meterlo en el cajón, rezando que el que funciona aguante muchos años.
Seguro que hay un motivo, siempre lo hay. ¿Has probado con un tercer equipo? Con una VM en Azure de las q tienen Visual Studio instalado podrías probar muy rápido...
Eliminar