将SVN工作副本修订号转换为VersionInfo.cs

时间:2012-02-27 13:24:34

标签: visual-studio-2010 svn revision assemblyinfo

我们SLN中的所有项目共享一个VersionInfo.cs,其中包含项目版本号

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

我想静态定义版本号的3个第一部分,最后部分我想成为SVN版本的工作副本。

第一步是在VS中定义一个触发cmd脚本的预构建事件,是否有一种从cmd获取工作副本修订版的简单方法?

第二步是将该号码插入VersionInfo.cs文件

Theres可能是更优雅的方式,如果你有一个在商店,请记住这是一个开源项目,我们没有一个花哨的构建服务器或类似的东西。部署过程只是将项目置于发布模式并构建:D

5 个答案:

答案 0 :(得分:2)

  

是否有一种简单的方法可以从cmd获取工作副本修订版?

有一个名为svnversion.exe的可执行文件,它在标准输出上打印修订版。如果您确定这是在PATH中,则可以调用此方法。

  

将该号码插入VersionInfo.cs文件

您可以从批处理文件中完全或部分生成VesionInfo.cs文件:

@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

编辑:

更新了批处理文件,以处理格式RRNN:RRNN:RRM的修订号,其中NN是整数,RR是修订版:

@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

答案 1 :(得分:1)

  • 如果是VisualStudio,那就是Windows
  • 如果是Windows,可以使用TortoiseSVN的SubWCRev

    1. 将VersionInfo.cs的模板写入存储库而不是最终文件,可更改的部分数据替换为(适当的)SubWCRev-keyword
    2. 在每个构建过程中运行SubWCRev,它使用模板和WC数据中的实际数据编写最终文件(完整构建器可以/开始/只需svn export + subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs

答案 2 :(得分:1)

hmjd:s解决方案只有一半,如果你每次构建所有项目时都写入文件,即使没有任何改变,引用版本文件需要重建,我改变了脚本只写入文件,如果它是新修订号

@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

答案 3 :(得分:1)

下载MSBuild Community Task并安装。

打开你的.csproj并在最后(封闭</project>标签之前)

粘贴以下代码(不要更改<Import>标记):

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

<Import>代码后粘贴以下内容:

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

查看SvnVersion标记内的属性 ToolPath ,您必须在其中确定计算机中 svnversion.exe 二进制文件的位置。

假设您安装了TortoiseSVN软件,其路径为:C:\ProgramFiles\TortoiseSVN\bin\ 您还可以使用VisualSVN二进制文件(在这种情况下,二进制文件位于C:\ProgramFiles\VisualSVN\bin\

在.csproj中进行此修改后,在每个构建项目中,MSBuild将首先调用svnversion.exe(带参数,当前解决方案目录),svnversion将返回该存储库的修订号。在FileUpdate标记中,MSBuild将查找正则表达式模式,然后替换为Major,Minor和Build的当前值(分别为$ 1,$ 2和$ 3),并使用变量Revision value更新版本

答案 4 :(得分:0)

您可以尝试使用Keyword Substitutes替换您提交的号码。他们以此为例:

$Rev$:     Revision of last commit
$Author$:  Author of last commit
$Date$:    Date of last commit