Obtendo o número de revisão da cópia de trabalho do SVN em VersionInfo.cs
-
13-11-2019 - |
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
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
- 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)
- 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