Compartir versionado entre ensamblados en .NET Core (I)
Introducción
Hace poco más de 10 años publiqué un video en Channel9 (con su correspondiente entrada en este blog) sobre cómo compartir el fichero AssemblyInfo entre proyectos de .NET con el fin de compartir versionado y/o otras propiedades a la hora de generar nuestros ensamblados.
La pregunta con la aparición de .NET Core en escena es obvia: ¿Cómo podemos realizar lo mismo con .NET Core?.
Una de las opciones que tenemos es utilizando MSBuild.
En Agosto de 2017 publiqué una entrada sobre Versionado de ensamblados con MSBuild en .NET Core 2.0 que quizás pueda interesarte.
Ahora bien, existen formas más cómodas de compartir el versionado de ensamblados entre diferentes proyectos.
Explicaré dos formas diferentes de lograr esto en dos entradas de mi blog.
Una de esas formas la encontrarás en esta entrada que estás leyendo.
La otra forma la podrás leer en otra entrada que tengo preparada al respecto.
AssemblyInfo
Lo primero que tenemos que saber es que en .NET Core no hay fichero AssemblyInfo.cs como en .NET Framework.
Otra cosa que debes conocer es que el versoinado se genera de forma automática y por defecto en tiempo de compilación, creándose así los metadatos de nuestros ensamblados.
Si dispones de Visual Studio, podrás acceder a los metadatos en las propiedades de cada proyecto que componga tu solución.
Así que teniendo claros estos conceptos, ¿cómo podemos reutilizar y compartir el versionado entre diferentes proyectos si cada proyecto no tiene fichero AssemblyInfo y esta información es accesible desde las propiedades del proyecto?.
GenerateAssemblyInfo
Dentro de los proyectos de .NET Core encontraremos cada uno de ellos en un fichero csproj con algo parecido a lo siguiente:
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
Si queremos que no se genere de forma automática la información de ensamblado, bastará con utilizar GenerateAssemblyInfo con el valor false.
Es decir, cada proyecto de .NET (fichero csproj) lo deberíamos tener parecido a lo que se indica a continuación:
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
De esta forma y por cada proyecto que tengamos esta propiedad a false, no se generará información de ensamblado de forma automática.
Ahora bien, si queremos compartir el versionado entre diferentes proyectos, por ejemplo dentro de una misma solución o no, deberemos indicar la versión del ensamblado de algún modo.
Ese «modo» es el mismo que conocemos para .NET.
Basta con generar un fichero, por ejemplo AssemblyInfo.cs, en algún lugar de la solución que consideremos compartida por todos los proyectos o bien en el proyecto principal en su raiz o dentro de una carpeta Properties u otro sitio, y escribir dentro de ese fichero el siguiente contenido (o algo similar):
using System.Reflection;
[assembly: AssemblyCompany(«My Company»)]
[assembly: AssemblyCopyright(«Copyright ©2019 by My Company»)]
[assembly: AssemblyTrademark(«Trademark My Company»)][assembly: AssemblyVersion(«1.5»)]
[assembly: AssemblyFileVersion(«1.5.0.4»)]
[assembly: AssemblyInformationalVersion(«1.5.0.4»)]
En el resto de proyectos deberemos agregar este fichero existente como enlace o link.
Al compilar nuestros proyectos, compartirán la versión de ensamblado entre ellos haciéndolos uniformes entre sí.
Si tienes más curiosidad sobre GenerateAssemblyInfo, te sugiero visitar este enlace.
En otra entrada explicaré otra forma de lograr esto mismo.
Espero que te haya resultado útil.
Happy Coding!