如何将SVN版本号与ASP.NET网站同步?


93

堆栈溢出在底部有一个Subversion版本号:

svn修订版:679

我想在.NET Web Site/ApplicationWindows窗体,WPD项目/解决方案中使用这种自动版本控制。

我该如何实施?


@Balloon如果使用的是TortoiseSVN,则可以使用打包的SubWCRev程序。它查询工作副本,并告诉您最高的修订号。诚然,这似乎是解决服务器端问题的客户端方法,但是由于它是一个不错的命令行程序,因此您应该能够轻松捕获其输出以供使用。
尼克

如果您不像我在这里所说的那样将TortoiseSVN用于SubWCRev ,则可以使用svnversion来做同样的事情。
尼克

Answers:



27

我们使用xUnit.net进行此操作以实现自动化构建。我们使用CruiseControl.net(并正在尝试TeamCity)。我们为持续集成而运行的MSBuild任务会自动为我们更改内部版本号,因此生成的内部ZIP文件包含一组版本正确的DLL和EXE。

我们的MSBuild文件包含一个执行正则表达式替换的DLL的UsingTask参考:(欢迎使用此DLL,因为它也受MS-PL许可证保护)

  <使用任务
     AssemblyFile =“ 3rdParty \ CodePlex.MSBuildTasks.dll”
     TaskName =“ CodePlex.MSBuildTasks.RegexReplace” />

接下来,我们提取内部版本号,由CI系统自动提供。如果需要,您还可以让源代码控制提供程序提供源版本号,但是我们发现CI系统中的内部版本号更有用,因为不仅可以通过CI内部版本号看到集成结果,而且还提供了链接回构建中包含的变更集。

 <!-级联尝试查找内部版本号->

 <PropertyGroup Condition =“'$(BuildNumber)'==''”>
   <BuildNumber> $(BUILD_NUMBER)</ BuildNumber>
 </ PropertyGroup>
 <PropertyGroup Condition =“'$(BuildNumber)'==''”>
   <BuildNumber> $(ccnetlabel)</ BuildNumber>
 </ PropertyGroup>
 <PropertyGroup Condition =“'$(BuildNumber)'==''”>
   <BuildNumber> 0 </ BuildNumber>
 </ PropertyGroup>

(我们尝试使用来自TeamCity的BUILD_NUMBER,然后尝试来自CC.net的ccnetlabel,如果都不存在,则默认为0,以便我们可以手动测试自动生成脚本。)

接下来,我们有一个任务,将内部版本号设置到一个GlobalAssemblyInfo.cs文件中,该文件链接到我们所有的项目中:

 <Target Name =“ SetVersionNumber”>
   <RegexReplace
       模式='AssemblyVersion \(“(\ d + \。\ d + \。\ d +)\。\ d +” \)'
       Replacement ='AssemblyVersion(“ $ 1。$(BuildNumber)”)'
       Files ='GlobalAssemblyInfo.cs'/>
   <Exec Command =“ attrib -r xunit.installer \ App.manifest” />
 </ Target>

这将找到AssemblyVersion属性,并将abcd版本号替换为abcBuildNumber。我们通常将源代码签入树中,并将生成器编号的前三个部分固定不变,将第四个部分固定为零(例如,今天是1.0.2.0)。

在构建过程中,请确保SetVersionNumber任务在构建任务之前。最后,我们使用Zip任务来压缩构建结果,以便我们拥有每个自动化构建的二进制文件的历史记录。


25

您可以通过在代码中的任意位置添加以下内容来实现

$Id:$

因此,例如,@ Jeff做到了:

<div id="svnrevision">svn revision: $Id:$</div>

然后在服务器中检查时,将$ Id:$替换为当前的修订号。我也找到了这个参考

还有$ Date:$$ Rev:$$ Revision:$


您需要确保文件也设置了svn:keywords属性,否则不会自动替换$ Id $等。请参阅页。(向下滚动至svn:keywords)
Michael Stum

1
我刚刚通过使用$ Rev $进行了尝试,并且在一定程度上有效。问题在于,它似乎仅在显示关键字的文件更改时才更新关键字。这意味着,如果对项目进行了不影响其中带有$ Rev $的文件的更改(在我的情况下,是我的ASP.NET主页),则该项目的修订版本将比显示给用户的版本更高。有人对此有任何想法吗?有没有办法让SVN 始终更新文件中的关键字?
克里斯·罗伯茨

5
这不只是将最后一次更改的修订号插入该特定文件吗?我尝试建立一个两个文件的存储库并更改了一个,然后尝试导出和检出,两种情况下另一个文件都保持为1。
Lasse V. Karlsen

lassevk是正确的,这仅在文件本身更改时更改。
布鲁诺·洛佩斯

使用VisualSVN和TortoiseSVN,添加$ Id:$只会使页面呈现“ $ Id:$”。注意此答案在什么服务器/客户端下工作可能会很有用。
特拉维斯

17

如果您正在使用ASP.Net MVC(就像StackOverflow一样),我就如何自动获取和显示最新的SVN修订版编写了一个易于遵循的三步指南。该指南的灵感来自于对这个问题的思考!:o)


听起来不错,但链接已断开!
彼得C

1
对于我们来说,这是一个很好的解决方案,可以基于SVN修订版自动显示版本。优点之一是不需要调用SVN服务器。
本·埃尔德

链接已断开或站点已关闭
Cacho Santa

1
感谢@cacho,已修复-这是服务器故障[sic]; o)
Andrew

10

@Balloon如果使用的是TortoiseSVN,则可以使用打包的SubWCRev程序。它查询工作副本,并告诉您最高的修订号。诚然,这似乎是解决服务器端问题的客户端方法,但是由于它是一个不错的命令行程序,因此您应该能够轻松捕获其输出以供使用。


9

$rev而其他类似文件则是单个文件的修订版,因此除非文件更改,否则它们不会更改。网页上的编号是(很可能在这里假设)整个项目的svn版本号。这与其他人所指的文件修订版不同。

在这种情况下,我假设CCNET正在提取项目的修订版本号,并使用该编号重写网页的一部分。任何CI解决方案都应该能够做到这一点,并通过CCNET和Teamcity自行设置(尽管不是网页,而是部署/程序集版本的自动版本控制)。

为了执行此操作,请使用支持它的CI解决方案,或者使用您的构建过程(MSbuild / Nant)来存储该版本并将其写入文件,然后再“部署”它。


5

要添加到@BradWilson的答案中:“如果需要,您还可以让源代码控制提供程序提供源版本号”

要连接Subversion和MSBuild: MSBuild社区任务项目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.