Actualizar automáticamente el número de versión


Me gustaría que la propiedad version de mi aplicación se incrementara para cada compilación, pero no estoy seguro de cómo habilitar esta funcionalidad en Visual Studio (2005/2008). He intentado especificar la AssemblyVersion como 1.0.* but it doesn't get me exactly what I want.

También estoy usando un archivo de configuración y en intentos anteriores cuando la versión de ensamblaje cambió mi configuración se restableció a la predeterminada ya que la aplicación buscó el archivo de configuración en otro directorio.

I me gustaría poder mostrar un número de versión en forma de 1.1.38 para que cuando un usuario encuentre un problema pueda registrar la versión que está utilizando, así como decirles que actualicen si tienen una versión antigua.

También se agradecerá una breve explicación de cómo funciona el control de versiones. ¿Cuándo se incrementa el número de compilación y revisión?

Author: Drise, 2008-08-03

7 answers

Con el "Construido en" cosas, no se puede, como el uso de 1.0.* o 1.0.0.* reemplazará los números de revisión y compilación con una fecha/marca de tiempo codificada, que generalmente también es una buena manera.

Para obtener más información, consulte la documentación del enlazador de ensamblador en la etiqueta /v.

En cuanto al incremento automático de números, utilice la tarea AssemblyInfo:

Tarea AssemblyInfo

Esto se puede configurar para incrementar automáticamente el número de compilación.

Hay 2 Gotchas:

  1. Cada uno de los 4 números en la cadena de versión está limitado a 65535. Esta es una limitación de Windows y es poco probable que se arregle.
  2. Usar con con Subversion requiere un pequeño cambio:

Recuperar el número de versión es entonces bastante fácil:

Version v = Assembly.GetExecutingAssembly().GetName().Version;
string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision);

Y, para aclarar: En.net o al menos en C#, la compilación es en realidad el TERCER número, no el cuarto como algunas personas (por ejemplo, los desarrolladores de Delphi que están acostumbrados a Major.Menor.Lanzar.Construir) podría esperar.

En.net, es Importante.Menor.Construir.Revision.

 88
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-28 04:10:16

VS.NET por defecto, la versión ensamblada es 1.0.* y utiliza la siguiente lógica cuando se incrementa automáticamente: establece la parte de compilación en el número de días desde el 1 de enero de 2000, y establece la parte de revisión en el número de segundos desde la medianoche, hora local, dividido por dos. Ver este artículo de MSDN.

La versión de ensamblado se encuentra en un assemblyinfo.vb o assemblyinfo.archivo CS. Del archivo:

' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' You can specify all the values or you can default the Build and Revision Numbers 
' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")> 

<Assembly: AssemblyVersion("1.0.0.0")> 
<Assembly: AssemblyFileVersion("1.0.0.0")> 
 19
Author: Solracnapod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-29 03:25:13

He encontrado que funciona bien simplemente mostrar la fecha de la última compilación usando lo siguiente cuando se necesita una versión del producto:

System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss")

En lugar de intentar obtener la versión de algo como lo siguiente:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false);
object attribute = null;

if (attributes.Length > 0)
{
    attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute;
}
 8
Author: user8128167,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-25 16:30:27

¿Qué sistema de control de código fuente está utilizando?

Casi todos ellos tienen algún tipo de etiqueta Id Id that que se expande cuando se registra el archivo.

Normalmente uso algún tipo de hacker para mostrar esto como el número de versión.

La otra alternativa es usar la fecha como número de compilación: 080803-1448

 6
Author: engtech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-03 18:46:33

[Visual Studio 2017, .csproj propiedades]

Para actualizar automáticamente su propiedad PackageVersion/Version/AssemblyVersion (o cualquier otra propiedad), primero, cree una nueva clase Microsoft.Build.Utilities.Task que obtendrá su número de compilación actual y devolverá el número actualizado (recomiendo crear un proyecto separado solo para esa clase).

Actualizo manualmente el major.números menores, pero deje que MSBuild actualice automáticamente el número de compilación (1.1.1, 1.1.2, 1.1.3, etc. :)

using Microsoft.Build.Framework;
using System;
using System.Collections.Generic;
using System.Text;

public class RefreshVersion : Microsoft.Build.Utilities.Task
{
    [Output]
    public string NewVersionString { get; set; }
    public string CurrentVersionString { get; set; } 

    public override bool Execute()
    {       
        Version currentVersion = new Version(CurrentVersionString ?? "1.0.0");

        DateTime d = DateTime.Now;
        NewVersionString = new Version(currentVersion.Major, 
            currentVersion.Minor, currentVersion.Build+1).ToString();
        return true;
    }

}

Luego llame a su Tarea recientemente creada en el proceso de MSBuild agregando el siguiente código en su .archivo csproj:

<Project Sdk="Microsoft.NET.Sdk">    
...
<UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\<dll path>\BuildTasks.dll" />
<Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
   <RefreshVersion CurrentVersionString="$(PackageVersion)">
          <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" />             
   </RefreshVersion>
   <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" />
   <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)\mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" />
</Target>
...
<PropertyGroup>
 ..
 <PackageVersion>1.1.4</PackageVersion>
 ..

Al elegir la opción proyecto de Visual Studio Pack (simplemente cambie a BeforeTargets="Build" para ejecutar la tarea antes de la compilación) se activará el código de actualización para calcular el nuevo número de versión, y XmlPoke la tarea actualizará su .propiedad csproj en consecuencia (sí, modificará el archivo).

Cuando se trabaja con NuGet bibliotecas, también envío el paquete al repositorio NuGet simplemente agregando la siguiente tarea de compilación al ejemplo anterior.

<Message Text="Uploading package to NuGet..." Importance="high" />
<Exec WorkingDirectory="$(MSBuildProjectDirectory)\bin\release" Command="c:\nuget\nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" />

c:\nuget\nuget es donde tengo el cliente NuGet (recuerde guardar su clave API de NuGet llamando a nuget SetApiKey <my-api-key> o incluir la clave en la llamada push de NuGet).

Por si acaso ayuda a alguien^_^.

 2
Author: Nacho Coll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-10 14:28:41

Hace algún tiempo escribí un exe rápido y sucio que actualizaría la versión #'s en un assemblyinfo.{cs / vb} - También he usado rxfind.exe (una herramienta de reemplazo de búsqueda simple y potente basada en expresiones regulares) para realizar la actualización desde una línea de comandos como parte del proceso de compilación. Un par de otros consejos helpfule:

  1. separe el assemblyinfo en partes del producto (nombre de la empresa, versión, etc.) y piezas específicas de montaje (nombre de montaje, etc.). Ver aquí
  2. También uso subversion, así que me pareció útil establecer el número de compilación en el número de revisión de subversion, lo que hace que sea realmente fácil volver siempre a la base de código que generó el ensamblado (por ejemplo, 1.4.100.1502 fue construido a partir de la revisión 1502).
 1
Author: caryden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-04 19:51:49

Si desea un número de incremento automático que se actualiza cada vez que se realiza una compilación, puede usar VersionUpdater desde un evento previo a la compilación. Su evento pre-build puede comprobar la configuración de build si lo prefiere para que el número de versión solo aumente para una compilación de Release (por ejemplo).

 0
Author: user283258,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-28 21:16:35