Como crear un template Dotnet para nuestras soluciones

A la hora de empezar nuestros desarrollos en C# en la mayoria de los veces hay una serie de pasos manuales que se repiten proyecto tras proyecto y que nos hacen perder un poco de tiempo en diversas tareas repetitivas y que al final nos hacen perder un valioso tiempo. En este articulo vamos a ver como usar el sistema de templates que nos proporciona DotNet y como la podemos publicar en un repositorio Nuget para ser accessible por todos los miembros del equipo.

¿Porqué debemos de tener un template?

En primer lugar esta es la primera pregunta que debemos de hacernos, el principal motivo que tiene que tener el template es ahorrarnos tiempo en tareas repetitivas y mecanicas. Este Template no debe de ser algo que tiene que ser válido para todos los proyectos (no hay balas de plata), sino que debe de incluir aquellos aspectos que estamos cansados de repetir proyecto tras proyecto, por ejemplo,

Esto quiere decir que si en alguno de dichos middleware quiero realizar alguna modificación no la podré hacer? La respuesta es que NO naturalmente es un template y nosotros somos desarrolladores y debemos de disponer de la creatividad necesaria para adaptarlo a nuestros requisitos y que todo lo que tenga el template no sea un stoper ni un impedimiento al equipo.

Qué beneficios nos proporciona

Al final una de las cosas más dificiles de conseguir en un equipo de desarrollo es que el sofware desarrollado sea del equipo y no sea un conjunto de piezas de cada uno de los developers que estan en el mismo. El tener un template no va a solucionar esto pero si que pone un esqueleto que puede ser la base en la que se fundamente el resto de la aplicación y si este template sirve para tener un marco de herramientas base para todos los proyecto creo que es un buen punto de partida y sobre el que debemos de poner los siguientes cimentos para conseguir el objetivo.

Manos a la obra

Crear la solución

En primer lugar tenemos que tener claro cual es el template que vamos a utilizar, en este ejemplo he creado una solución en la que hay montada una API, con diversos servicios. Se quedaria una solución como la siguiente:

Solución Visual Studio

De esta solución comentar que en el middeware de la API tenemos montado la configuración de diversos middleware que vamos a utilizar en dicha API: Problem Details, Swagger, Autofac, Autenticación con el Azure Active Directory, etc.. quedando de la siguiente forma:

StartUp

En la parte de los test tenemos montado un ejemplo de como empezar a Testear todos los métodos que tiene el controlador, para ello hacemos uso diversas librerias que nos facilitan la vida como son TestServer, Acheve, FluenAssertions, Bogut y XUnit de tal forma que podamos escribir test de integración de una forma muy sencilla.

UnitTesting

El contenido del template lo podeis ver en mi repositorio de GitHub,aunque no es contenido meternos en profundidad en dicha solución sino que hacemos hincapie en diversos artefactos que hemos añadido para poder entender los motivos que nos ha llevado a ello.

Añadir la configuración que requiere DotNet

Una vez tenemos claro nuestro template deberemos de crear una carpeta .template.config y dentro de la misma un fichero template.json que deberia tener una estructura como la siguiente:

{
    "$schema": "http://json.schemastore.org/template",
    "author": "Adrian Díaz",
    "classifications": [ "Web", "WebAPI" ],
    "identity": "Avenger.APITemplate.CSharp",
    "groupIdentity":"Avenger.APITemplate",
    "name": "ASP.NET Core Avenger Web API ",
    "shortName": "avengerwebapi",
    "tags": {
        "language": "C#",
        "type":"project"
      },      
      "sourceName": "Avenger"
    }

De dicho Json lo que debemos de tener claro:

Una vez tenemos la configuración y el template el primer paso es instalarlo en nuestra maquina para poder comprobar que funciona correctamente para ello tendremos que hacer el siguiente comando:

dotnet new -i {ruta donde se encuenta la carpeta .template.config}

Si todo ha ido bien y ahora hacemos un dotnet new visualizaremos que dentro de las opciones disponibles tendremos la nueva solución que acabamos de crear.

solution dotnet

Si quremos desinstalar el template deberemos de ejecutar la siguiente instrucción

dotnet new -u {ruta donde se encuenta la carpeta .template.config}

Instalarla en un servidor de Nuget

Hemos creado la solución pero ahora el siguiente paso que debemos de hacer es añadirla en un servidor de paquetes como es Nuget para que todos los miembros del equipo la puedan utilizar. Para ello en primer lugar en la solucion deberemos de crear un fichero con extensión .nuspec que deberia de quedar de la siguiente forma:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>Avenger.APITemplate.CSharp</id>
    <version>1.0.0</version>
    <description>
      Creates the Avenger API.
    </description>
    <authors>Adrián Díaz</authors>
    <packageTypes>
      <packageType name="Template" />
    </packageTypes>
  </metadata>
</package>

Más o menos la única diferencia con un paquete de Nuget “clasico” es que en packageTypes deberemos de indicar que es de tipo Template.

Con el fichero nuspec creado el siguiente paso ya es crear un proceso que nos automatice la publicación de dicho Template en el servidor de Nuget bien público o bien privado. Para ello una build sencilla con los siguientes pasos seria suficiente:

Azure DevOps Build Nuget

Una ves esta la solución instalada en el servidor de Nuget lo único que haria falta seria que cada desarrollador se la instale en su maquina de desarrollo para ello con instalar el siguiente comando

dotnet new -i avenger.apitemplate.csharp

Resumen

La creación de una plantilla con multiples soluciones es algo bastante sencillo y que nos puede ahorrar mucho tiempo a la hora de empezar los desarrollos. Este tipo de plantilla se puede complicar todo lo que realmente necesitemos, por ejemplo si queremos añadir un tipo de proyectos o no, si quemos renombrar la solución, etc.. para ver toda las posiblidades que hay recomiendo que visualiceis el repo oficial de dotnet donde hay multitud de ejemplos.

Happy Coding.