100

Stack Overflow 底部有一个 subversion 版本号:

svn 修订:679

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

我该如何实施?

4

7 回答 7

32

看起来 Jeff 正在使用CruiseControl.NET ,这是基于对播客记录的一些翻阅。这似乎具有从源代码控制到生产的自动化部署能力。这可能是插入发生的地方吗?

于 2008-08-01T18:24:30.550 回答
28

我们使用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 系统中的 build # 更有用,因为不仅可以通过 CI 版本号查看集成结果,还提供了一个链接回构建中包含的变更集。

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

 <PropertyGroup Condition="'$(BuildNumber)' == ''">
   <BuildNumber>$(BUILD_NUMBER)</BuildNumber>
 </属性组>
 <PropertyGroup Condition="'$(BuildNumber)' == ''">
   <BuildNumber>$(ccnetlabel)</BuildNumber>
 </属性组>
 <PropertyGroup Condition="'$(BuildNumber)' == ''">
   <BuildNumber>0</BuildNumber>
 </属性组>

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

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

<目标名称="SetVersionNumber">
   <正则表达式替换
       模式='AssemblyVersion\("(\d+\.\d+\.\d+)\.\d+"\)'
       替换='AssemblyVersion("$1.$(BuildNumber)")'
       文件='GlobalAssemblyInfo.cs'/>
   <Exec Command="attrib -r xunit.installer\App.manifest"/>
 </目标>

这将找到 AssemblyVersion 属性,并将 abcd 版本号替换为 abcBuildNumber。我们通常将源检查到树中,固定构建器编号的前三个部分,第四部分为零(fe,今天是 1.0.2.0)。

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

于 2008-08-16T18:00:22.303 回答
25

您可以通过在代码中的任何位置添加以下内容来做到这一点

$Id:$

因此,例如@Jeff 做了:

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

并在服务器签入时将 $Id:$ 替换为当前修订号。我也找到了这个参考

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

于 2008-08-01T18:08:16.590 回答
17

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

于 2008-12-17T10:17:00.347 回答
10

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

于 2008-09-15T19:04:33.680 回答
9

$rev和其他类似的文件是对单个文件的修订,因此除非文件更改,否则它们不会更改。网页上的数字是(很可能,我在这里假设)整个项目的 svn 修订号。这与其他人一直指出的文件修订不同。

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

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

于 2008-08-13T01:28:33.427 回答
5

要添加到@BradWilson 的答案:“如果需要,您还可以让源代码控制提供商提供源修订号”

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

于 2008-10-01T11:51:48.137 回答