2

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

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

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

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

第二步是将该数字插入到 VersionInfo.cs 文件中

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

4

5 回答 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

编辑:

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

@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
于 2012-02-27T13:28:03.790 回答
1
  • 如果是 VisualStudio,那就是 Windows
  • 如果是 Windows,你可以使用 TortoiseSVN 的 SubWCRev

    1. 将 VersionInfo.cs 的模板写入存储库而不是最终文件,数据的可变部分被(适当的)SubWCRev-keyword 替换
    2. 在每个构建过程中运行 SubWCRev,它使用来自模板和 WC 数据的实际数据写入最终文件(完整的构建器可以 /started/ 就像svn export+一样简单subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs
于 2012-02-28T09:05:56.100 回答
1

hmjd:s 解决方案只有一半,如果每次构建所有引用 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
于 2012-02-28T13:07:33.630 回答
1

下载MSBuild 社区任务并安装它。

打开您的 .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 值更新 Revision

于 2013-11-26T17:19:45.147 回答
0

您可以尝试使用关键字替换来替换您提交的数字。他们以这个为例:

$Rev$:     Revision of last commit
$Author$:  Author of last commit
$Date$:    Date of last commit
于 2012-02-27T13:32:28.447 回答