如何让C# MVC程序读取TortoiseSVN版本号,含TFS迁移方案
一、TortoiseSVN自动写入版本号到文件(提交时触发)
TortoiseSVN自带的SubWCRev.exe可以帮你把版本号写入指定文件,搭配钩子脚本就能在提交时自动执行。
1. 准备工作
- 确认
SubWCRev.exe路径:默认在C:\Program Files\TortoiseSVN\bin\SubWCRev.exe,如果安装路径不同,自行替换。 - 为目标文件创建模板文件(避免直接覆盖原文件),模板里用SubWCRev的变量占位,常用变量:
$WCREV$:当前工作副本的最新版本号$WCDATE$:最后更新日期
示例1:生成Web可访问的文本文件
- 在项目根目录创建
VersionTemplate.txt,内容:
当前SVN版本号:$WCREV$ 最后更新时间:$WCDATE$
- 创建批处理文件
UpdateVersion.bat,内容:
@echo off "C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" . VersionTemplate.txt Version.txt
- 设置TortoiseSVN预提交钩子:
- 右键项目文件夹 → TortoiseSVN → 设置 → 钩子脚本
- 点击「添加」,选择「预提交钩子」,浏览选择刚才的
UpdateVersion.bat - 提交代码时,脚本会自动生成
Version.txt到项目根目录,Web应用可直接读取。
示例2:修改AssemblyInfo.cs
- 备份
Properties\AssemblyInfo.cs,然后创建Properties\AssemblyInfoTemplate.cs,修改版本号行:
[assembly: AssemblyVersion("1.0.$WCREV$.0")] [assembly: AssemblyFileVersion("1.0.$WCREV$.0")]
- 修改
UpdateVersion.bat内容:
@echo off "C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" . Properties\AssemblyInfoTemplate.cs Properties\AssemblyInfo.cs
- 同样设置预提交钩子,提交时会自动替换版本号到
AssemblyInfo.cs,编译后程序集版本会包含SVN号。
示例3:修改web.config
- 备份
web.config,创建WebConfigTemplate.config,添加版本号配置节点:
<appSettings> <!-- 其他配置 --> <add key="SVNVersion" value="$WCREV$" /> </appSettings>
- 修改
UpdateVersion.bat内容:
@echo off "C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" . WebConfigTemplate.config Web.config
- 设置预提交钩子,提交后web.config会自动更新版本号,代码可通过
ConfigurationManager.AppSettings["SVNVersion"]读取。
二、通过代码读取.svn目录获取版本号
不依赖钩子脚本的话,可以直接读取.svn目录的信息,这里提供两种可靠方法:
方法1:调用SubWCRev命令行
在C#代码中直接执行SubWCRev获取版本号,无需操作.svn文件:
using System.Diagnostics; using System; public static class SvnHelper { public static string GetCurrentSvnVersion() { var subWCRevPath = @"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe"; var workingDir = AppDomain.CurrentDomain.BaseDirectory; var processStartInfo = new ProcessStartInfo { FileName = subWCRevPath, Arguments = $"{workingDir} -n", // -n参数只输出版本号 RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; using (var process = Process.Start(processStartInfo)) { process.WaitForExit(); return process.StandardOutput.ReadToEnd().Trim(); } } }
方法2:读取.svn的SQLite数据库
新版本TortoiseSVN用wc.db(SQLite数据库)存储版本信息,可通过SQLite库读取(需添加System.Data.SQLite NuGet包):
using System.Data.SQLite; using System; public static class SvnHelper { public static string GetSvnVersionFromDb() { var dbPath = $@"{AppDomain.CurrentDomain.BaseDirectory}.svn\wc.db"; using (var conn = new SQLiteConnection($"Data Source={dbPath};Version=3;")) { conn.Open(); var cmd = new SQLiteCommand("SELECT revision FROM NODES WHERE local_relpath = '.'", conn); var result = cmd.ExecuteScalar(); return result?.ToString() ?? "未知版本"; } } }
三、迁移到TFS后获取版本号的方法
TFS(现名Azure DevOps Server)可以通过构建流水线或代码读取版本号:
1. 构建时写入版本号到文件/配置
- 写入文本文件:在TFS构建流水线中添加「PowerShell」任务,脚本示例:
# 获取TFS构建编号(可在流水线变量中自定义格式) $buildVersion = "$(Build.BuildNumber)" # 写入到版本文件 Add-Content -Path "$(Build.ArtifactStagingDirectory)\TFSVersion.txt" -Value $buildVersion
- 修改AssemblyInfo.cs:添加「Assembly Info」任务,设置版本号格式为
1.0.$(Build.BuildId).0,构建时自动替换程序集版本。 - 修改web.config:用「替换令牌」任务,在web.config中预留
#{TFSVersion}#占位符,流水线中设置变量TFSVersion=$(Build.BuildNumber),构建时自动替换。
2. 代码读取TFS版本号
- 读取程序集版本(构建时已写入):
using System.Reflection; using System.Diagnostics; public static class TfsHelper { public static string GetTfsAssemblyVersion() { var assembly = Assembly.GetExecutingAssembly(); var fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); return fileVersion.FileVersion; } }
- 读取web.config中的配置:
using System.Configuration; public static class TfsHelper { public static string GetTfsVersionFromConfig() { return ConfigurationManager.AppSettings["TFSVersion"]; } }
内容的提问来源于stack exchange,提问作者Perry
相关产品推荐
相关产品推荐

