以编程方式获取SVN修订号(.NET)

我知道这个问题已经弹出好几次了,比如这里: 将subversion存储库编号转换为代码 。

但要么我理解太复杂,要么我的项目太复杂。 这是我的简要设置:几个开发人员使用visual studio 2012和ankhsvn连接到我们的subversion存储库,开发.net Web应用程序。 开发服务器使用cruisecontrol.net同步存储库中的最新文件。 测试服务器,手动复制特定修订版以进行QA。

请求是在网站上显示最新版本,以便测试人员知道他们正在查看的版本。

什么是最简单的方法? 是否有一些直接从代码中获取它的方法(最佳方案)? 可以在cruisecontrol.net上为我做这件事(但是这样可以省去手动部署的测试服务器)。 我搜索和搜索了很多解决方案似乎很麻烦,我只是想知道在我开始构建一个精心设计的装置之前是否有更简单的方法。

修订版号不能“直接从代码”获得(我假设你的意思是你的代码),除非你自己把它放在那里。

有多种方法可以做到这一点(下面的列表并不详尽),具体取决于您的构建过程是什么样的以及您想要做多少工作。

  1. 使用$Revision$关键字并让Subversion客户端CCNet自动调用它。
  2. 在构建过程中使用SubWCRev.exe和一些自定义代码(脚本)将值插入到您的文件中。
  3. 在构建过程中使用SharpSVN和一些自定义代码(脚本或EXE)将值插入到文件中。

你的问题不够具体,不能详细介绍。 你没有描述你所发现的未指明解决方案的“麻烦”,而“最简单”是一个非常主观的衡量标准。

我们团队中的代码为QA / Beta和生产环境部署代码提供了相同的环境。 在我看来和我们这样做的方式,这可以通过简单的dos脚本和svn命令行客户端来完成。

除此之外,我们还提供了当前版本相对于生产部署所拥有的所有更改的列表。 这样开发者就可以清楚地知道从分期到生活会发布什么样的差异。

以下是:

我们的CCnet部署为每个开发应用程序配置了3个相关项目。

  1. 分期
    • 使用来自该项目的每个开发人员的每个svn提交进行自动构建
    • 生成构建的版本号
    • 从生产代码生成svn差异列表。
  2. QA
    • 手动构建
    • MS是否使用实时设置构建(连接字符串和其他环境配置)
    • 将其与登台环境分开
    • 带有版本和更改历史记录。
  3. 生活
    • 仅从QA区域推送。
    • 手动构建。
    • 将所有利益相关者的版本号和更改列表邮寄。

CCnet模板:

版本文件创建器模板

这将在Web根文件夹中创建该版本

   $(command_line_program_path)    /C echo {0} > "$(appRootFolder)\Version.txt"    $CCNetLabel   buildArgs   900 0   

发布当前版本中的更改wrt Production

此模板使用dos脚本进行工作,本节后面将对此进行说明

    versionHistoryPublisher.bat "$(svnPathForProductionVersion)" "$(appDirectory)" "$(svnSrcCodeRootPath)" $(svn_password)   

用于从SVN中提取变更历史的DOS脚本

 @echo off set currentProductionVersionFileSvnUrl=%1 set workingDirectory=%2 set sourceCodeSvnPath=%3 set svnPassword=%4 REM **** Creating the file with last production version *** svn export "%currentProductionVersionFileSvnUrl%//Version.txt" "%workingDirectory%\lastProductionVersion.txt" --username %svnusername% --password %svnPassword% --force --non-interactive --quiet set /p lastCcnetBuildNumber=< %workingDirectory%\lastProductionVersion.txt set /p currentCcnetBuildNumber=< %workingDirectory%\Version.txt for /f "tokens=4 delims=." %%a in ("%lastCcnetBuildNumber%") do set lastSvnRevisionNumber=%%a for /f "tokens=4 delims=." %%a in ("%currentCcnetBuildNumber%") do set headRevisionNumber=%%a for /f "tokens=1 delims= " %%a in ("%headRevisionNumber%") do set headRevisionNumber=%%a echo %lastVersion% echo Changes in current deployment wrt production. > %workingDirectory%\currentChangeList.txt echo =============================================== >> %workingDirectory%\currentChangeList.txt echo Current revison : %headRevisionNumber% >> %workingDirectory%\currentChangeList.txt echo Compared to production version : %lastSvnRevisionNumber% >> %workingDirectory%\currentChangeList.txt echo =============================================== >> %workingDirectory%\currentChangeList.txt svn log %sourceCodeSvnPath% -r %headRevisionNumber%:%lastSvnRevisionNumber% --verbose --username %svnusername% --password %svnPassword% >> %workingDirectory%\currentChangeList.txt 

CCNET分段项目定义示例

  ...your project configurations....         .. your ms build configuration...                

版本信息位于version.txt文件中,代码更改历史记录位于currentChangeList.txt文件中。 由于这两个文件都在Web根目录中,因此可以通过URL轻松访问它们

此外,如果您想在网站上显示版本号,您可以轻松地从version.txt中读取一行,并在app_start期间的任何位置显示它。

如果您知道存储库路径, SharpSVN允许您执行此操作:

 using SharpSvn; private static long GetRevision() { using (SvnClient client = new SvnClient()) { SvnInfoEventArgs info; return client.GetInfo(SvnPathTarget.FromString(REPO_PATH), out info) ? info.Revision : 0; } } 

subversion使用的db是sqlite,在项目的.svn文件夹中称为wc.db。 您需要做的就是使用sqlite db提供程序( Install-Package System.Data.Sqlite ),并使用wc.db的完整路径作为连接字符串中的数据源, Select max(revision) from NODE运行Select max(revision) from NODE

接受答案的第二点非常简单,并提供了所需的结果:在应用程序UI中的某处输出修订号:

在构建过程中使用SubWCRev.exe和一些自定义代码(脚本)将值插入到您的文件中。

1)考虑要使用的Assembly属性 ,并在你的一个项目的AssemblyInfo文件中注释/删除它的行(我选择了“common”项目和AssemblyFileVersion属性)。 某些限制可能适用于基于msbuild版本的各种程序集属性,如此处所示。

2) 创建用于生成整个版本的模板 。 例如: SolutionInfo.cs.tmpl

 using System.Reflection; // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyFileVersion("1.0.0.$WCREV$")] // [assembly: AssemblyVersion("1.0.0.$WCREV$")] 

3) 创建用于存储生成版本的实际文件 。 例如: SolutionInfo.cs 。 这可以是空的,因为它将在构建时自动生成。 构建之后,它应该是这样的:

 using System.Reflection; // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyFileVersion("1.0.0.16788")] // [assembly: AssemblyVersion("1.0.0.16788")] 

确保从源代码管理中忽略/排除此文件。

4)创建prebuild事件以获取修订版号并从其模板创建文件:

 "C:\Program Files\TortoiseSVN\bin\subwcrev" "$(ProjectDir).\.." "$(ProjectDir)\Properties\SolutionInfo.cs.tmpl" "$(ProjectDir)\Properties\SolutionInfo.cs" 

注意:此构建事件假定TortoiseSVN在其默认路径中安装了subwcrev。 构建服务器必须具有相同的配置,以便构建不会崩溃。 如果在PATH注册了subwcrev ,则不再需要完整路径。

5) 版本获取

 public static class VersionExtensions { public static string GetFileVersion(this Assembly assembly) { var value = assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false) .OfType() .SingleOrDefault(); return value != null ? value.Version : "?.?.?.?"; } public static string GetCommonFileVersion() { var assembly = Assembly.GetAssembly(typeof(Common.Web.VersionExtensions)); var value = assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false) .OfType() .SingleOrDefault(); return value != null ? value.Version : "?.?.?.?"; } 

请求是在网站上显示最新版本,以便测试人员知道他们正在查看的版本。

这就是我打算做的事情:测试人员需要你建立的构建信息。 为什么不创建调用svnversionsvn info批处理文件并将输出写入文本文件? 您可以使用项目/解决方案文件的后期构建事件来调用它,甚至可以在部署新构建时使用cruisecontrol。 如果文件是在您的网站中生成的,您可以使用asp.net阅读并在页脚中包含信息,或者只是让测试人员访问此文本文件。

不是直接的解决方案。 但肯定会有用。