2012-02-27 85 views
2

我们所有的在我们的SLN股票项目VersionInfo.cs持有该项目的版本号流汗SVN工作拷贝修订版本号VersionInfo.cs

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

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

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

步骤二号是插入该数字到VersionInfo.cs文件

即使世界可能更优雅的这样做的方法,如果你在商店里一个只要记住,这是一个开源项目,我们没有花哨的构建服务器或类似的东西。部署过程只是把项目在发布模式和构建:D

回答

1

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 
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是一个整数,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 
+0

感谢您的反馈,我下载svnversion.exe并以这种格式输出33:37M,其中37是修订版本,因此您的批处理脚本将创建一个无效的版本号,我正在考虑创建一个小小的C#控制台程序,并对版本进行解析并创建文件在那里,但也许这是矫枉过正,有更好的方法吗? – Anders 2012-02-27 14:20:55

+0

@Anders,在用DOS提取修订号之后更新了答案。 – hmjd 2012-02-27 14:54:09

+0

@Anders - 你有混合的工作副本。它的目的是如此吗? – 2012-02-28 08:52:09

0

你可以尝试使用Keyword Substitutes更换号码作为您提交。他们有这个作为一个例子:

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

为了这个工作您需要每次更新VersionFile.cs以获得新修订版本,$ Rev $仅反映实际文件更改的时间... – Anders 2012-02-27 13:40:19

+0

啊,有效点。 – jprofitt 2012-02-27 13:50:18

+0

$ Rev $关键字扩展为坏的(对于这个任务)字符串,就像这个'$ Revision:1028 $' – 2012-02-28 08:56:56

1
  • 如果是VisualStudio的,它的Windows
  • 如果是Windows,则可以使用SubWCRev在TortoiseSVN

    1. VERSIONINFO的写模板。cs到存储库而不是最终文件,那里有可改变的部分数据被替换为(适当的)SubWCRev关键字
    2. 在每个构建过程运行的SubWCRev中,最后一个文件包含来自模板和WC数据的实际数据(完整构建器可以/开始/简单,如svn export + subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs
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标签,在这里你必须标识你的机器的位置是svnversion.exe二进制文件。

假设您已经安装了TortoiseSVN的软件,它的路径是:C:\ProgramFiles\TortoiseSVN\bin\ 你也可以使用的VisualSVN二进制文件(在这种情况下,二进制文件位于C:\ProgramFiles\VisualSVN\bin\

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