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

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

svn修订版:679

我想用我的.NET Web Site/Application ,Windows窗体,WPD项目/解决scheme来使用这种自动版本控制。

我如何实现这个?

看起来杰夫正在使用CruiseControl.NET基于一些翻播播客抄本。 这似乎具有从源代码pipe理到生产的自动部署function。 可能这是插入发生的地方?

我们使用xUnit.net为我们的自动构build做到这一点。 我们使用CruiseControl.net (并试用TeamCity)。 我们为持续集成运行的MSBuild任务会自动更改我们的内部版本号,因此生成的构buildZIP文件包含一组正确版本化的DLL和EXE。

我们的MSBuild文件包含一个用于执行正则expression式replace的DLL的UsingTask引用:(欢迎使用此DLL,因为它也包含在MS-PL许可中)

   <UsingTask
      AssemblyFile = “的3rdParty \ CodePlex.MSBuildTasks.dll”
      TASKNAME = “CodePlex.MSBuildTasks.RegexReplace”/>

接下来,我们提取由CI系统自动提供的内部版本号。 你也可以让你的源代码pipe理提供者提供源代码版本号,但是我们发现CI系统中的版本号更有用,因为它不仅可以看到CI版本号的集成结果,还提供了链接回构build中包含的变更集。

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

  <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,以便我们可以手动testing自动构build脚本。

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

  <目标名称=“SetVersionNumber”>
    <REGEXREPLACE
       图案= '的AssemblyVersion \( “(\ d + \。\ d + \。\ d +)\。\ d +” \)'
       更换= '的AssemblyVersion( “$ 1 $(BuildNumber)”)'
       文件= 'GlobalAssemblyInfo.cs'/>
    <Exec Command =“attrib -r xunit.installer \ App.manifest”/>
  </目标>

这find了AssemblyVersion属性,并用abcBuildNumberreplace了abcd版本号。 我们通常会将源代码复制到树中,其中前三个部分是固定的,第四个是零(fe,今天是1.0.2.0)。

在您的构build过程中,确保SetVersionNumber任务先于您的构build任务。 最后,我们使用Zip任务来压缩构build结果,这样我们就可以获得每个自动构build的二进制文件的历史logging。

您可以在代码中的任何位置添加以下代码

 $Id:$ 

所以举个例子@Jeff做了:

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

并在服务器中选中当前版本号replace$ Id:$。 我也find了这个参考 。

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

如果你使用ASP.Net MVC (就像StackOverflow那样),我已经编写了一个简单的关于如何自动获取和显示最新的SVN修订版的3步指南 。 这个指南的灵感来自于思考这个问题。 :O)

@Balloon如果您使用的是TortoiseSVN,则可以使用打包的SubWCRev程序。 它查询工作副本,并告诉你最高版本号。 无可否认,这似乎是服务器端问题的客户端方法,但由于它是一个很好的命令行程序,所以您应该能够很容易地捕获其输出。

$rev和其他类似的文件是个别文件的修订,所以它们不会改变,除非文件改变。 网页上的数字(很可能,我假设在这里)是整个项目的svn修订版号。 这与其他人指出的文件版本不同。

在这种情况下,我假设CCNET正在拉取项目的修订号,并用该号码重写网页的一部分。 任何CI解决scheme应该能够做到这一点,使用CCNET和Teamcity(尽pipe不是网页,但自动版本化部署/组装版本)自己设置。

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

要添加到@ BradWilson的答案: “你也可以让你的源代码pipe理提供商提供源修订版本号,如果你想”

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