【问题标题】:How do I sync the SVN revision number with my ASP.NET web site?如何将 SVN 修订号与我的 ASP.NET 网站同步?
【发布时间】:2023-11-23 08:44:01
【问题描述】:

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

svn 修订:679

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

我该如何实现?

【问题讨论】:

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

标签: .net asp.net svn versioning


【解决方案1】:

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

【讨论】:

  • 如果您不使用 CruiseControl.Net,请查看我的答案(无耻插件!)-*.com/questions/163/… ;o)
  • 链接已损坏@saint_groceon
【解决方案2】:

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

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

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

$(BUILD_NUMBER)属性组> $(ccnetlabel)属性组> 0属性组>

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

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

目标>

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

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

【讨论】:

    【解决方案3】:

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

    $Id:$
    

    例如@Jeff 做了:

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

    并在服务器签入时将 $Id:$ 替换为当前修订号。我也found this reference

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

    【讨论】:

    • 您需要确保文件也设置了 svn:keywords 属性,否则 $Id$ 等不会自动替换。请参阅this 页面。 (向下滚动到 svn:keywords)
    • 我刚刚通过使用 $Rev$ 进行了尝试,它在一定程度上有效。问题是它似乎只在它出现的文件发生更改时才更新关键字。这意味着,如果对项目进行的更改不影响其中包含 $Rev$ 的文件(在我的情况下,是我的 ASP.NET 母版页),则该项目的修订版本将高于向用户显示的版本.有人对此有任何想法吗?有没有办法让SVN总是更新文件中的关键字?
    • 这不只是插入该特定文件的最后更改的修订号吗?我尝试设置一个双文件存储库并更改了一个,并尝试导出和签出,而另一个文件在两种情况下都保持为 1。
    • lassevk 是正确的,这仅在文件本身更改时才会更改。
    • 使用 VisualSVN 和 TortoiseSVN,添加 $Id:$ 只是导致页面呈现“$Id:$”。注意这个答案在哪个服务器/客户端下工作可能很有用。
    【解决方案4】:

    如果你使用ASP.Net MVC(就像 * 一样),我写了一个easy to follow 3-step guide on how to automatically get and display the latest SVN revision。该指南的灵感来自于对这个问题的思考! :o)

    【讨论】:

    • 听起来不错,但链接坏了!
    • 这对我们来说是一个很好的解决方案,可以根据我们的 SVN 修订自动显示版本控制。一个优点是它不需要调用您的 SVN 服务器。
    • 链接已损坏,或网站已关闭
    • 感谢@cacho,已修复 - 这是服务器故障 [原文如此] ;o)
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

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

        要连接 Subversion 和 MSBuild: MSBuild Community Tasks Project

        【讨论】:

          最近更新 更多