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

108

Me gustaría que la propiedad de versión 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). Intenté especificar AssemblyVersion como 1.0. * Pero no me da exactamente lo que quiero.

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.

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á usando y decirle que actualice si tiene una versión anterior.

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

Robert Höglund
fuente
La siguiente pregunta tiene una solución simple y conveniente sobre cómo inyectar un número de compilación en su aplicación generando un archivo fuente en un evento de compilación. stackoverflow.com/questions/4450231/…
Ashley Davis

Respuestas:

96

Con las cosas "incorporadas", no puede, ya que usar 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 de Assembly Linker en la etiqueta / v.

En cuanto a incrementar números automáticamente, use la tarea AssemblyInfo:

Tarea AssemblyInfo

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

Hay 2 problemas:

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

Recuperar el número de versión es 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.Minor.Release.Build) podrían esperar.

En .net, es Major.Minor.Build.Revision.

Michael Stum
fuente
3
Acabo de encontrar este complemento de Visual Studio que hace algo similar: autobuildversion.codeplex.com
jrsconfitto
6
¿Significa eso que el 4 de junio de 2179 se romperán los números de versión predeterminados de Microsoft? (el día 65536 después de 2000)
Lloyd Powell
1
@Jugglingnutcase - ese enlace sería casi perfecto, si funcionara para las versiones actuales de Visual Studio
Kraang Prime
2
@SanuelJackson jaja! sí lo haría. Lástima que no sigo mis comentarios de 2010, ¡lo siento! : P La marcha del tiempo y las versiones nos entristece a todos.
jrsconfitto
@Michael Stum: ¿Podría actualizar el enlace para la tarea AssemblyInfo en su respuesta, por favor? Para mí, no se carga correctamente.
Matt
22

VS.NET establece por defecto la versión de Ensamblaje en 1.0. * Y usa 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, dividida por dos. Consulte este artículo de MSDN .

La versión de ensamblado se encuentra en un archivo assemblyinfo.vb o assemblyinfo.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")> 
Solracnapod
fuente
Gracias por incluir la fecha inicial:January 1st, 2000
kiewic
11

Descubrí que funciona bien simplemente mostrar la fecha de la última compilación usando lo siguiente siempre que se necesite 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;
}
user8128167
fuente
6
Creo que te refieres a esto: aaaa.MM.dd.HHmm no aaaa.MM.dd.HHMM.
JHubbard80
1
Esta es la solución más simple para tener algún tipo de número de versión adjunto al cambio del archivo de ensamblaje.
Alexei
6

¿Qué sistema de control de fuente estás usando?

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

Normalmente utilizo algún tipo de piratería 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

engtech
fuente
¿Puede expandir "Casi todos tienen algún tipo de etiqueta $ Id $ que se expande cuando se registra el archivo"? Específicamente, ¿sabes por subversión?
Greg B
3

[Visual Studio 2017, propiedades de .csproj ]

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

Actualizo manualmente los números principales y menores, pero dejo 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 de proyecto Visual Studio Pack (simplemente cambie a BeforeTargets="Build"para ejecutar la tarea antes de la compilación), el código RefreshVersion se activará para calcular el nuevo número de versión y la XmlPoketarea actualizará su propiedad .csproj en consecuencia (sí, modificará el archivo).

Cuando trabajo con bibliotecas NuGet, 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\nugetes donde tengo el cliente NuGet (recuerde guardar su clave API de NuGet llamando nuget SetApiKey <my-api-key>o incluir la clave en la llamada push de NuGet).

Por si acaso ayuda a alguien ^ _ ^.

Nacho Coll
fuente
1

Hace algún tiempo escribí un exe rápido y sucio que actualizaría los números de versión en un assemblyinfo. {Cs / vb} - También he usado rxfind.exe (una herramienta de reemplazo de búsqueda simple y poderosa basada en expresiones regulares) para hacer el actualizar desde una línea de comando como parte del proceso de compilación. Un par de otras sugerencias útiles:

  1. separe la información de ensamblaje en partes del producto (nombre de la empresa, versión, etc.) y partes específicas del ensamblaje (nombre del ensamblaje, etc.). Ver aqui
  2. Además, utilizo subversion, por lo que me resultó útil establecer el número de compilación en el número de revisión de subversión, lo que hace que sea realmente fácil volver siempre al código base que generó el ensamblaje (por ejemplo, 1.4.100.1502 se construyó a partir de la revisión 1502).
caryden
fuente
Si es para un archivo de código ( .cs / .vb), debe usar una plantilla T4 en su lugar.
BrainSlugs83
0

Si desea un número de incremento automático que se actualice cada vez que se realiza una compilación, puede usar VersionUpdater desde un evento previo a la compilación. Su evento previo a la compilación puede verificar la configuración de compilación si lo prefiere para que el número de versión solo se incremente para una compilación de lanzamiento (por ejemplo).

usuario283258
fuente
Interesante. He tenido el mío durante años con el mismo nombre y no sabía que existía uno (aunque lo puse en línea recientemente): github.com/rjamesnw/VersionUpdater
James Wilkins