Pergunta

Todos os nossos projetos em nosso SLN compartilham um VersionInfo.cs que contém o número da versão do projeto

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

Quero definir estaticamente as 3 primeiras partes do número da versão e a última parte que quero ser a revisão SVN da cópia de trabalho.

A etapa número um é definir um evento de pré-construção no VS que acione um script cmd. Existe uma maneira fácil de obter a revisão da cópia de trabalho do cmd?

A etapa número dois é inserir esse número no arquivo VersionInfo.cs

Provavelmente existem maneiras mais elegantes de fazer isso, se você tiver uma disponível, lembre-se de que este é um projeto de código aberto e não temos um servidor de compilação sofisticado ou algo parecido.O procedimento de implantação é apenas colocar o projeto em modo release e construir :D

Foi útil?

Solução 3

A solução hmjd:s estava apenas pela metade, se você gravar no arquivo toda vez que construir todos os projetos referentes ao arquivo de versão precisa ser reconstruído, mesmo que nada tenha mudado, alterei o script para gravar no arquivo apenas se for um novo número de revisão

@ECHO off

FOR /F "tokens=1,2 delims=:M" %%A in ('svnversion ../ -c') do SET PART_1=%%A&SET PART_2=%%B

SET file=../VersionInfo.cs

IF NOT DEFINED PART_2 (
SET SVN_REV=%PART_1%
)

IF NOT DEFINED SVN_REV (
SET SVN_REV=%PART_2%
)

set result=0

for /f "tokens=3" %%f in ('find /c /i ".%SVN_REV%." %file%') do set result=%%f

IF %result% gtr 0 (
GOTO end
)

ECHO using System.Reflection; > %file%
ECHO [assembly: AssemblyVersion("0.1.%SVN_REV%.0")]     >>  %file%
ECHO [assembly: AssemblyFileVersion("0.1.%SVN_REV%.0")] >> %file%

:end

Outras dicas

Existe uma maneira fácil de obter a revisão da cópia de trabalho do cmd?

Existe um executável chamado svnversion.exe que imprime na saída padrão a revisão.Se você garantir que isso esteja em seu PATH você poderia chamar isso.

Para inserir esse número no arquivo VersionInfo.cs

Você poderia gerar o VesionInfo.cs arquivo completo ou parcialmente de um arquivo em lote:

@echo off

FOR /F %%A in ('svnversion') do SET SVN_REV=%%A

echo [assembly: AssemblyVersion("0.0.1.%SVN_REV%")]     >  VersionInfo.cs
echo [assembly: AssemblyFileVersion("0.0.1.%SVN_REV%")] >> VersionInfo.cs

EDITAR:

Arquivo em lote atualizado para lidar com os números de revisão do formato RR, NN:RR e NN:RRM onde NN é um número inteiro e RR é a revisão:

@ECHO off

FOR /F "tokens=1,2 delims=:M" %%A in ('svnversion') do SET PART_1=%%A&SET PART_2=%%B

IF NOT DEFINED PART_2 (
SET SVN_REV=%PART_1%
)

IF NOT DEFINED SVN_REV (
SET SVN_REV=%PART_2%
)

ECHO [assembly: AssemblyVersion("0.0.1.%SVN_REV%")]     >  VersionInfo.cs
ECHO [assembly: AssemblyFileVersion("0.0.1.%SVN_REV%")] >> VersionInfo.cs
  • Se for VisualStudio, é Windows
  • Se for Windows, você pode usar o SubWCRev do TortoiseSVN

    1. Escreva o modelo de VersionInfo.cs no repositório em vez do arquivo final, a parte mutável dos dados é substituída pela palavra-chave SubWCRev (apropriada)
    2. Em cada processo de construção, execute o SubWCRev, que grava o arquivo final com os dados reais do modelo e dos dados WC (o construtor completo pode ser /iniciado/ tão simplesmente quanto svn export + subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs)

Download Tarefa da comunidade MSBuild e instale-o.

Abra seu .csproj e no final (antes do fechamento </project> marcação)

Cole o seguinte código (não altere o <Import> marcação):

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 

Depois de <Import> tag cole o seguinte:

  <Target Name="BeforeBuild">
      <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(ProgramFiles)\TortoiseSVN\bin">
          <Output TaskParameter="Revision" PropertyName="Revision" />
      </SvnVersion>
      <FileUpdate Files="Properties\AssemblyInfo.cs" Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)" ReplacementText="$1.$2.$3.$(Revision)" />
  </Target>

Veja o atributo Caminho da ferramenta dentro da tag SvnVersion, é onde você deve identificar o local onde na sua máquina está o svnversion.exe arquivo binário.

Supondo que você tenha o software TortoiseSVN instalado, o caminho para ele é: C:\ProgramFiles\TortoiseSVN\bin\Você também pode usar os binários VisualSVN (neste caso, o arquivo binário está localizado em C:\ProgramFiles\VisualSVN\bin\)

Com esta modificação em seu .csproj, em cada projeto de construção, o MSBuild chamará primeiro o svnversion.exe (com o argumento, o diretório da solução atual) e o svnversion retornará o número de revisão desse repositório.Na tag FileUpdate, o MSBuild procurará o padrão regex e, em seguida, substituirá pelos valores atuais para Major, Minor e Build ($1, $2 e $3 respectivamente) e atualizará a Revisão com o valor da variável Revision

Você poderia tentar usar Substitutos de palavras-chave para substituir o número conforme você está confirmando.Eles têm isso como exemplo:

$Rev$:     Revision of last commit
$Author$:  Author of last commit
$Date$:    Date of last commit
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top