Saltar al contenido

¿Cómo tener un número de versión de incremento automático (Visual Studio)?

Posterior a consultar expertos en el tema, programadores de deferentes ramas y maestros hemos dado con la solución a la pregunta y la compartimos en esta publicación.

Solución:

Si agrega una clase AssemblyInfo a su proyecto y modifica el AssemblyVersion attribute para terminar con un asterisco, por ejemplo:

[assembly: AssemblyVersion("2.10.*")]

Visual Studio aumentará el número final para usted de acuerdo con estas reglas (gracias galets, ¡estaba completamente mal!)

Para hacer referencia a esta versión en el código, de modo que pueda mostrársela al usuario, utilice reflection. Por ejemplo,

Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1)
                        .AddDays(version.Build).AddSeconds(version.Revision * 2);
string displayableVersion = $"version (buildDate)";

Tres trampas importantes que debes saber

De @ ashes999:

También vale la pena señalar que si ambos AssemblyVersion y AssemblyFileVersion se especifican, no verá esto en su .exe.

Desde @ BrainSlugs83:

Establecer solo el cuarto número * puede ser malo, ya que la versión no siempre se incrementa.
El tercer número es el número de días desde el año 2000, y el cuarto número es el número de segundos desde la medianoche (dividido por 2) [IT IS NOT RANDOM]. Entonces, si construyó la solución al final de un día un día, y temprano al día siguiente, la compilación posterior tendría un número de versión anterior. Recomiendo usar siempre X.Y.* en lugar de X.Y.Z.* porque su número de versión SIEMPRE aumentará de esta manera.

Las versiones más nuevas de Visual Studio dan este error:

(este hilo comenzó en 2009)

La versión especificada string contiene comodines, que no son compatibles con el determinismo. Elimina los comodines de la versión. string, o deshabilite el determinismo para esta compilación.

Vea esta respuesta SO que explica cómo eliminar el determinismo (https://stackoverflow.com/a/58101474/1555612)

Puede usar el mecanismo de plantillas T4 en Visual Studio para generar el código fuente requerido a partir de un archivo de texto simple:

Quería configurar la generación de información de versión para algunos proyectos .NET. Ha pasado mucho tiempo desde que investigué las opciones disponibles, así que busqué con la esperanza de encontrar una forma sencilla de hacerlo. Lo que encontré no parecía muy alentador: la gente escribe complementos de Visual Studio y tareas personalizadas de MsBuild solo para obtener un número entero (bueno, tal vez dos). Esto se sintió excesivo para un pequeño proyecto personal.

La inspiración vino de una de las discusiones de StackOverflow donde alguien sugirió que las plantillas T4 podrían hacer el trabajo. Y por supuesto que pueden. La solución requiere un esfuerzo mínimo y no requiere Visual Studio ni personalización del proceso de compilación. Aquí lo que se debe hacer:

  1. Cree un archivo con extensión “.tt” y coloque allí la plantilla T4 que generará AssemblyVersion y AssemblyFileVersion attributes:
<#@ template language="C#" #>
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.1.<#= this.RevisionNumber #>")]
<#+
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2010,1,1)).TotalDays;
#>

Tendrá que decidir sobre el algoritmo de generación del número de versión. Para mí fue suficiente generar automáticamente un número de revisión que se establece en el número de días desde el 1 de enero de 2010. Como puede ver, la regla de generación de la versión está escrita en C # simple, por lo que puede ajustarla fácilmente a sus necesidades. .

  1. El archivo anterior debe colocarse en uno de los proyectos. Creé un nuevo proyecto con solo este archivo para aclarar la técnica de administración de versiones. Cuando construyo este proyecto (en realidad ni siquiera necesito hacerlo: guardar el archivo es suficiente para activar una acción de Visual Studio), se genera el siguiente C #:
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.113")]
[assembly: AssemblyFileVersion("1.0.1.113")]

Sí, hoy son 113 días desde el 1 de enero de 2010. Mañana cambiará el número de revisión.

  1. El siguiente paso es eliminar AssemblyVersion y AssemblyFileVersion attributes de los archivos AssemblyInfo.cs en todos los proyectos que deben compartir la misma información de versión generada automáticamente. En su lugar, elija “Agregar elemento existente” para cada proyecto, navegue hasta la carpeta con el archivo de plantilla T4, seleccione el archivo “.cs” correspondiente y agréguelo como un enlace. ¡Que hará!

Lo que me gusta de este enfoque es que es liviano (sin tareas personalizadas de MsBuild) y la información de versión generada automáticamente no se agrega al control de código fuente. Y, por supuesto, el uso de C # para el algoritmo de generación de versiones abre para algoritmos de cualquier complejidad.

Esta es mi implementación de la sugerencia T4 … Esto incrementará el número de compilación cada vez que compile el proyecto independientemente de la configuración seleccionada (es decir, Debug | Release), e incrementará el número de revisión cada vez que haga una compilación de Release. Puede continuar actualizando los números de versión principal y secundaria a través de Aplicación ➤ Información de montaje …

Para explicar con más detalle, esto leerá el existente AssemblyInfo.cs archivo, y use regex para encontrar el AssemblyVersion información y luego incremente los números de revisión y compilación en función de la entrada de TextTransform.exe.

  1. Elimina tu existente AssemblyInfo.cs expediente.
  2. Crear un AssemblyInfo.tt archivo en su lugar. Visual Studio debería crear AssemblyInfo.cs y agrúpelo con el archivo T4 después de guardar el archivo T4.

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ output extension=".cs" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Text.RegularExpressions" #>
    <#
        string output = File.ReadAllText(this.Host.ResolvePath("AssemblyInfo.cs"));
        Regex pattern = new Regex("AssemblyVersion\("(?\d+)\.(?\d+)\.(?\d+)\.(?\d+)"\)");
        MatchCollection matches = pattern.Matches(output);
        if( matches.Count == 1 )
        
            major = Convert.ToInt32(matches[0].Groups["major"].Value);
            minor = Convert.ToInt32(matches[0].Groups["minor"].Value);
            build = Convert.ToInt32(matches[0].Groups["build"].Value) + 1;
            revision = Convert.ToInt32(matches[0].Groups["revision"].Value);
            if( this.Host.ResolveParameterValue("-","-","BuildConfiguration") == "Release" )
                revision++;
        
    #>
    
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    using System.Resources;
    
    // General Information
    [assembly: AssemblyTitle("Insert title here")]
    [assembly: AssemblyDescription("Insert description here")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("Insert company here")]
    [assembly: AssemblyProduct("Insert product here")]
    [assembly: AssemblyCopyright("Insert copyright here")]
    [assembly: AssemblyTrademark("Insert trademark here")]
    [assembly: AssemblyCulture("")]
    
    // Version informationr(
    [assembly: AssemblyVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: AssemblyFileVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: NeutralResourcesLanguageAttribute( "en-US" )]
    
    <#+
        int major = 1;
        int minor = 0;
        int revision = 0;
        int build = 0;
    #>
    
  3. Agregue esto a su evento previo a la construcción:

    "%CommonProgramFiles(x86)%microsoft sharedTextTemplating$(VisualStudioVersion)TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)PropertiesAssemblyInfo.tt"
    

Aquí tienes las reseñas y valoraciones

Si tienes alguna perplejidad o disposición de aumentar nuestro artículo te mencionamos añadir una interpretación y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *