martes, 15 de agosto de 2017

Entrada Vintage: problemas de versiones con .NET core y Visual Studio 2015

Esta entrada describe un problema que sufro de vez en cuando, y que de una vez por todas he decidido investigar, para documentar la solución y no volver a perder el tiempo. Quizás llegue un poco tarde… mas aun cuando acaban de anunciar .NET Core 2
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:

Error arranque

Al compilar este:

ErrorCompilar


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
dotnetAntes

  • La versión del CLI, con dotnet --version. Tengo la versión 1.0.4 del CLI
dotnetVersionAntes

  • 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
infoAntes

  • ¿Hay otros SDK's instalados?, Para ello miramos directamente en la carpeta ProgramFiles\dotnet\SDK
Versiones
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
ProgramasAntes

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


error dotnetbuild

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:

repararSDK


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)

tooling
Después de hacerlo (de nuevo detectó que ya estaba instalado)... sigue fallando la compilación
repairtools

Tercer intento, desinstalamos todo y empezamos de cero


Después de desinstalar todo solo voy a instalar las tools de Visual Studio 2015

image


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
  • image
          Parece que no, solo hay un SDK, el instalado por las tools como era de esperar.
  • ¿Qué dice Windows que tenemos instalado?  Miramos a Agregar/Quitar programas. Tenemos un Sdk preview y el tooling preview

image



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.


image

Como esperaba, obtengo un bonito error al tratar de ejecutar. Me indica que el runtime .NET Core 1.1 no esta disponible 

image

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
download
image


Una vez finalizada la instalación, problemas: A partir de ese momento... si intento compilar de nuevo obtengo errores! Se ha vuelto a romper.
image
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
image
      Vemos que si, ha aparecido el SDK 1.0.4

  • ¿Qué dice Windows que tenemos instalado?  Miramos a Agregar/Quitar programas
image

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í:
image

¿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

image



Espero que os sea de utilidad!


Recursos:

2 comentarios:

  1. Acho, y eso que el .NET Core ese iba a simplificar las cosas.

    Yo 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.

    ResponderEliminar
    Respuestas
    1. 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