将SVN工作副本的版本号获取到VersionInfo.cs中

3

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

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

我希望将版本号的前三个部分静态定义,并将最后一个部分作为工作副本SVN修订版。第一步是在VS中定义一个预构建事件,触发cmd脚本,有没有一种简单的方式从cmd获取工作副本修订版?第二步是将该数字插入VersionInfo.cs文件中。可能有更优雅的方法来完成这个过程,但请记住,这是一个开源项目,我们没有任何高级的构建服务器之类的东西。部署过程只需将项目设置为发布模式并构建即可:D
5个回答

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

感谢您的反馈,我已经下载了svnversion.exe并且它输出的格式是33:37M,其中37是版本号,因此您的批处理脚本将创建一个无效的版本号。我正在考虑创建一个小的C#控制台程序来解析版本和创建文件,但也许这有些过度了,是否有更好的方法? - Anders
@Anders,在使用DOS提取修订版本号后,更新了答案。 - hmjd
@Anders - 你的工作副本混乱了。这是有意为之吗? - Lazy Badger
@Anders - 你的工作副本混乱了。这是有意为之吗? - Lazy Badger
我刚使用TortoiseSVN从sourceforge SVN进行了检出,我不是SVN专家:D 这是repo svn://svn.code.sf.net/p/freepie/code/trunk。 - Anders

2
  • 如果是VisualStudio,那就是Windows系统
  • 如果是Windows系统,你可以使用TortoiseSVN中的SubWCRev工具

    1. 将VersionInfo.cs的模板写入代码库而不是最终文件,其中可更改的数据部分用(适当的)SubWCRev关键字替换
    2. 在每次构建过程中运行SubWCRev,它会使用模板和WC数据编写出带有实际数据的最终文件(完整的构建过程可以像这样简单地启动:svn export + subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs

2

hmjd的解决方案只有一半,如果每次构建所有引用Versionfile的项目时都写入文件,则即使没有更改,也需要重新构建,我修改了脚本,仅在出现新的修订号时才写入文件。

@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

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标签内的Attribute 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值的修订版。


0
你可以尝试使用关键词替换在提交代码时替换数字。他们有一个示例:
$Rev$:     Revision of last commit
$Author$:  Author of last commit
$Date$:    Date of last commit

为使此功能正常工作,您需要每次更新VersionFile.cs以获得新的修订版本,因此$Rev$仅反映实际文件发生更改的时间。 - Anders
$Rev$ 关键字会扩展成糟糕(对于这个任务来说)的字符串,例如 $Revision: 1028 $ - Lazy Badger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接