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

Fre*_*k T 5 .net c# svn ankhsvn

我知道这个问题已经弹出好几次了,就像这里一样:将subversion存储库编号转换为代码.

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

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

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

Ale*_*xei 8

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

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

1) 考虑要使用的程序集属性,并在您的项目AssemblyInfo文件之一中注释/删除其行(我选择了“通用”项目和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$")]
Run Code Online (Sandbox Code Playgroud)

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")]
Run Code Online (Sandbox Code Playgroud)

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

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

"C:\Program Files\TortoiseSVN\bin\subwcrev" "$(ProjectDir).\.." "$(ProjectDir)\Properties\SolutionInfo.cs.tmpl" "$(ProjectDir)\Properties\SolutionInfo.cs"
Run Code Online (Sandbox Code Playgroud)

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

5)版本获取

public static class VersionExtensions
{
    public static string GetFileVersion(this Assembly assembly)
    {
        var value = assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)
                            .OfType<AssemblyFileVersionAttribute>()
                            .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<AssemblyFileVersionAttribute>()
                            .SingleOrDefault();

        return value != null ? value.Version : "?.?.?.?";
    }
Run Code Online (Sandbox Code Playgroud)


alr*_*roc 5

除非您自己将其放在那里,否则无法“直接从代码”获得修订号(我假设您指的是您的代码)。

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

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

您的问题还不够具体,无法深入了解更多细节。您还没有描述您找到的未指定解决方案的“麻烦”之处,“最简单”是一个非常主观的衡量标准。