Ir al contenido
  1. Posts/

Como crear un template Dotnet para nuestras soluciones

·6 mins
Adri谩n D铆az Cervera
Autor
Adri谩n D铆az Cervera

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,

  • tener un proyecto de Test en el que ya tenemos instalados un Test Server, el StartUp y las librerias que hacemos uso para dicho efecto
  • tener configurado algunos middleware que hacemos uso si o si: inyecci贸n de dependencias, Problem Details, Swagger, versioning, configuraci贸n

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:

  • Classifications => Cuando hacemos dotnet new nos muestra los distintos tipos de proyectos que hay agrupados por cada uno de los tipos de proyectos y sus distintas tipos ejemplo: Common/Console, Test/xUnit, Web/MVC/SPA, Solution, … etc
  • shortName => el nombre que va a tener nuestra soluci贸n cuando hagamos el comando dotnet new ..
  • tags => Aqui deberemos de indicar cual es el lenguaje de programaci贸n en el que vamos acrear nuestra soluci贸n, en nustro caso C#
  • sourceName => Aqui se indica el valor que va a reemplazar en nuestra soluci贸n de todos los proyectos que tenemos, obteniendo el valor que se le pase por la linea de comando o bien la carpeta donde se encuetra de esta forma tendremos una nueva soluci贸n con los nombres estrablecidos.

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.