Pergunta

Gostaria que a propriedade version do meu aplicativo fosse incrementada a cada compilação, mas não tenho certeza de como habilitar essa funcionalidade no Visual Studio (2005/2008).Tentei especificar AssemblyVersion como 1.0.*, mas não obtive exatamente o que desejo.

Também estou usando um arquivo de configurações e em tentativas anteriores, quando a versão do assembly foi alterada, minhas configurações foram redefinidas para o padrão, pois o aplicativo procurou o arquivo de configurações em outro diretório.

Eu gostaria de poder exibir um número de versão no formato 1.1.38 para que, quando um usuário encontrar um problema, eu possa registrar a versão que está usando e também solicitar que atualizem se tiverem uma versão antiga.

Uma breve explicação de como funciona o controle de versão também seria apreciada.Quando o número de compilação e revisão é incrementado?

Foi útil?

Solução

Com o material "Integrado", você não pode, pois usar 1.0.* ou 1.0.0.* substituirá a revisão e os números de compilação por um carimbo de data/hora codificado, o que geralmente também é uma boa maneira.

Para mais informações, consulte o Vinculador de montagem Documentação na tag /v.

Quanto ao incremento automático de números, use a tarefa AssemblyInfo:

Tarefa AssemblyInfo

Isso pode ser configurado para incrementar automaticamente o número da compilação.

Existem 2 pegadinhas:

  1. Cada um dos 4 números na string Versão está limitado a 65535.Esta é uma limitação do Windows e é improvável que seja corrigida.
  2. Usar with com o Subversion requer uma pequena mudança:

Recuperar o número da versão é 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);

E, para esclarecer:Em .net ou pelo menos em C#, a compilação é na verdade o TERCEIRO número, não o quarto como algumas pessoas (por exemplo, desenvolvedores Delphi que estão acostumados com Major.Minor.Release.Build) podem esperar.

Em .net, é Major.Minor.Build.Revision.

Outras dicas

O VS.NET padroniza a versão do Assembly para 1.0.* e usa a seguinte lógica ao incrementar automaticamente:ele define a parte de construção para o número de dias desde 1º de janeiro de 2000 e define a parte de revisão para o número de segundos desde a meia-noite, horário local, dividido por dois.Veja isso Artigo MSDN.

A versão do assembly está localizada em um arquivo assemblyinfo.vb ou assemblyinfo.cs.Do arquivo:

' 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")> 

Descobri que funciona bem simplesmente exibir a data da última compilação usando o seguinte sempre que uma versão do produto for necessária:

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

Em vez de tentar obter a versão de algo como o seguinte:

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;
}

Qual sistema de controle de origem você está usando?

Quase todos eles têm alguma forma de tag $ Id $ que é expandida quando o arquivo é verificado.

Normalmente uso alguma forma de hackery para exibir isso como o número da versão.

A outra alternativa é usar a data como número da compilação:080803-1448

[Estúdio Visual 2017, .csproj propriedades]

Para atualizar automaticamente sua propriedade PackageVersion/Version/AssemblyVersion (ou qualquer outra propriedade), primeiro crie um novo Microsoft.Build.Utilities.Task class que obterá seu número de compilação atual e enviará de volta o número atualizado (recomendo criar um projeto separado apenas para essa classe).

Eu atualizo manualmente os números major.minor, mas deixo o MSBuild atualizar automaticamente o número da compilação (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;
    }

}

Em seguida, chame seu processo Task on MSBuild recentemente criado adicionando o próximo código em seu arquivo .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>
 ..

Ao escolher a opção de projeto do Visual Studio Pack (basta mudar para BeforeTargets="Build" para executar a tarefa antes do Build) o código RefreshVersion será acionado para calcular o novo número de versão, e XmlPoke task atualizará sua propriedade .csproj de acordo (sim, modificará o arquivo).

Ao trabalhar com bibliotecas NuGet, também envio o pacote para o repositório NuGet apenas adicionando a próxima tarefa de compilação ao exemplo 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 é onde eu tenho o cliente NuGet (lembre-se de salvar sua chave de API NuGet chamando nuget SetApiKey <my-api-key> ou para incluir a chave na chamada push do NuGet).

Apenas no caso de ajudar alguém ^_^.

Algum tempo atrás eu escrevi um exe rápido e sujo que atualizaria os números da versão em um assemblyinfo.{cs/vb} - Eu também usei rxfind.exe (uma ferramenta de substituição de pesquisa simples e poderosa baseada em regex) para fazer o atualizar a partir de uma linha de comando como parte do processo de construção.Algumas outras dicas úteis:

  1. separe as informações da montagem em partes do produto (nome da empresa, versão, etc.) e peças específicas da montagem (nome da montagem, etc.).Ver aqui
  2. Além disso - eu uso o subversion, então achei útil definir o número da compilação para o número de revisão do subversion, tornando muito fácil voltar sempre à base de código que gerou o assembly (por exemplo,1.4.100.1502 foi construído a partir da revisão 1502).

Se você quiser um número de incremento automático que seja atualizado sempre que uma compilação for concluída, você pode usar Atualizador de versão de um evento de pré-construção.Seu evento de pré-compilação pode verificar a configuração da compilação, se você preferir, para que o número da versão aumente apenas para uma compilação de lançamento (por exemplo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top