Migrando desde Net Core 2.2 a Net 5.0 y/o 6.x


En el post anterior hablamos de mi proyecto «DotNet.ApiRest.BasicTemplate» como proyecto plantilla para la generación de API Rest en Net Core 2.2, pues bien, en este caso vamos a ver que pasos seguir para migrarlo a Net 5.0 y 6.x.

Aunque podemos hacerlo de manera manual, he optado por seguir las recomendaciones de Microsoft utilizando para ello el asistente » Upgrade-Assistant«.

Actualización a .NET 5.0

En primer lugar instalamos dicho asistente de manera global.

dotnet tool install -g upgrade-assistant

A continuación, lanzamos el asistente desde línea de comandos una vez posicionados en la ruta del proyecto, en concreto, en la carpeta «DotNet.ApiRest.BasicTemplate\content». En mi caso, en: «C:\dev\DotNet.ApiRest.BasicTemplate\content«.

upgrade-assistant .\ElGuerre.Items.sln

Dado que optamos por la migración para la solución (.sln) completa, pulsamos (1) para seleccionar el «entrypoint» o proyecto sobre el que realizar la migración.

Tras unos segundos, el proyecto queda seleccionado y listo para el Upgrade. Volvemos a pulsar (1) según nos indica el asistente. En este punto, es el momento de hacer un backup. ¡Al disponer de git y seguir gitflow, he creado una «feature», por lo que podría haber omitido este paso.!

Ejecutamos el Backup pulsando (1) y, aun pensando que todo va a ir bien, nos encontramos con el siguiente error: «Try-Convert» not found«. ¡Esto me pasa por no leer el tutorial/introducción antes de comenzar con la migración 🙂!

Realizamos la instalación de dicha herramienta tal y como se indica a continuación.

dotnet tool install -g try-convert

Y volvemos a lanzar la migración. Automáticamente se completan los pasos previamente seleccionados. ¡Parace que el asistente a memorizado las selecciones previas y las ha ejecutado!. Seguidamente, vamos con el siguiente paso, «Update TFM«, es decir, con la actualización del target (o re-target) a Net 5.0.

Pulsamos (1), para aplicar los cambios y tras los mismos pulsamos «Enter» para continuar. El proceso continua registrando extensiones y actualizando/eliminando algunos paquetes Nuget.

Como siguiente paso «Update NuGet packages«, por lo que volvemos a pulsar (1) y «Enter» cuando nos lo solicite el asistente. De igual forma, con los pasos 5 y 6 hasta completar el proceso.

Llegados al último paso y, antes de ejecutarlo «Move to next project«, veamos que ocurre al tratar de compilar el proyecto desde Visual Studio:

A pesar de que el asistente ha realizado algunas gestiones con los paquetes Nuget y otros cambios, no ha sido lo suficientemente inteligente como para realizar completamente la misma, por lo que tendremos que hacer algunos ajustes manualmente:

  • Instalar los siguientes paquetes Nuget (en su versión 5.0.4), dado que en la versión anterior 2.2, estos se encontraban incluidos dentro de «Microsoft.AspNetCore.App» y en Net 5.0 ya no es así:
    • Microsoft.EntityFrameworkCore
    • Microsoft.EntityFrameworkCore.InMemory
    • Microsoft.EntityFrameworkCore.Relational
    • Microsoft.EntityFrameworkCore.SqlServer
    • System.Data.SqlClient
  • Cambiar las instrucciones «ForSqlServerUseSequenceHiLo» por «UseHilo«
  • Sustituir «IHostingEnvironment» por «IWebHostEnvironment«

¡Ahora si, podemos compilar el proyecto con exito!.

Si volvemos al asistente, al punto donde lo dejamos y tratamos de indicar el siguiente proyecto a migrar, es decir uno de los proyectos de tests, nos encontramos con que es realmente imposible seleccionar uno de ellos, por lo que la única opción es cancelar esta selección (o movimiento de proyecto) y lanzar nuevamente el asistente para cada proyecto de tests de manera individual. ¡No he visto que se encuentre registrado esto como bug, pero diría que es así!

Nos posicionamos ahora en la ruta «test» y ejecutamos el asistente para el proyecto «ElGuerre.Items.Api.IntegrationTests«.

upgrade-assistant .\ElGuerre.Items.Api.IntegrationTests\ElGuerre.Items.Api.IntegrationTests.csproj

Sustituimos nuevamente «IHostingEnvironment» por «IWebHostEnvironment«.

Y volvemos a repetir el proceso para el proyecto «ElGuerre.Items.Api.Tests«

upgrade-assistant .\ElGuerre.Items.Api.Tests\ElGuerre.Items.Api.Tests.csproj

Nuevamente, tratamos de compilar la solución y, una vez más nos encontramos con errores.

A pesar de ejecutar el asistente y parecer que realiza la actualizacion de EntityFramework, no es así, por lo que tenemos que completar el proceso manualmente para ambos proyectos de Tests. Sustituiremos por tanto en los .csproj, el valor de la versión 2.2.6 por 5.0.4, para las referencias de los paquetes «Microsoft.EntityFrameworkCore.xxx«.

Ejecución en Net 5.0

Finalmente el proyecto se ejecuta pero arrojando un error:

Endpoint Routing does not support 'IApplicationBuilder.UseMvc(...)'. To use 'IApplicationBuilder.UseMvc' set 'MvcOptions.EnableEndpointRouting = false' inside 'ConfigureServices(...).

Por lo que añadimos la siguiente instrucción y asi, la ejecución es completa y todo un exito.

options.EnableEndpointRouting = false;

Actualización a Net 6.x

Ya tenemos el código en Net 5.0, objetivo conseguido. Más que suficiente dado que 6.x se encuentra aún en preview. No obstante, vamos a ello, es muy sencillo. Basta disponer de Visual Studio 2019 Preview y el SDK de Net 6.0 instalado. Después, únicamente necesitamos hacer un «re-targeting» a «Net 6.0».

Nota: El «re-targeting» a Net 6.0 para el proyecto «ElGuerre.Items.Api» he tenido que hacerlo editando manualmente el .csproj, debido al siguiente error («An error occurred while loading the project properties editor. System.Operation.CanceledException. The operation was canceled«): ¿Otro bug? 😦

Ejecución en Net 6.0

Nuevamente, al tratar de ejecutar el proyecto, nos topamos con este otro error:

System.IO.FileNotFoundException. The configuration file 'secrets.json' was not found and is not optional. The physical path is ..."

El fichero de secretros no existe para Net 6.0. ¡Curioso pero la ruta es la misma!. Editamos o simplemente abrimos el fichero json de User Secrets, mediante la opción de menu contextual «Manage User Secrets» y, todo listo.

Nota: Ahora que ya hemos migrado a Net 5.0 y 6.x. Nuestros siguientes pasos consistirán en ir mejorando y adaptando el código a las nuevas carácterísticas y mejoras tanto del framework como de C# 9.0.

¡Ya no hay excusas para desarrollar con Net 5.0 / Net 6.x!

Un saludo y happy .NET 5.0/6.x coding.
Juanlu

Referencias:

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.