Stack Overflow 底部有一个颠覆版本号:

svn 修订版:第679章

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

我该如何实施?

有帮助吗?

解决方案

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

其他提示

我们这样做是通过 xUnit.net 用于我们的自动化构建。我们用 CruiseControl.net (并且正在尝试 TeamCity)。我们为持续集成而运行的 MSBuild 任务会自动为我们更改内部版本号,因此生成的构建 ZIP 文件包含一组正确版本化的 DLL 和 EXE。

我们的 MSBuild文件 包含 DLL 的UsingTask 引用,该DLL 执行正则表达式替换:(欢迎您使用此 DLL,因为它也包含在 MS-PL 许可证中)

  <UsingTask
     AssemblyFile="3rdParty\CodePlex.MSBuildTasks.dll"
     TaskName="CodePlex.MSBuildTasks.RegexReplace"/>

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

 <!-- Cascading attempts to find a build number -->

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

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

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

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

这会找到 AssemblyVersion 属性,并将 a.b.c.d 版本号替换为 a.b.c.BuildNumber。我们通常会将源代码保留在树中,并且构建器编号的前三个部分是固定的,第四部分为零(例如,今天是 1.0.2.0)。

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

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

$Id:$

例如@Jeff 做了:

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

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

还有 $日期:$, $Rev:$, $修订:$

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

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

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

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

为了做到这一点,请使用支持它的 CI 解决方案,或者使用构建过程 (MSbuild/Nant) 来存储该版本并在“部署”之前将其写入文件。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top