26

有没有办法在 .NET 程序集的版本字符串中包含 SVN 存储库修订号?像 Major.Minor.SVNRev 这样的东西

我已经看到提到使用 CC.NET 之类的东西(虽然实际上是在 ASP.NET 上),但有没有任何方法可以在没有任何额外软件的情况下做到这一点?在使用构建批处理脚本之前,我在 C/C++ 中做过类似的事情,但是通过读取版本号来完成,然后让脚本每次都写出一个名为“ver.h”的文件,效果如下:

#define MAJORVER 4
#define MINORVER 23
#define SOURCEVER 965

然后我们将使用这些定义来生成版本字符串。

.NET 可以做到这样的事情吗?

4

8 回答 8

32

这是用于自动更新程序集中的修订信息的 C# 示例。它基于 Will Dean 的回答,不是很详细。

例子 :

  1. 将 AssemblyInfo.cs 复制到项目文件夹Properties中的 AssemblyInfoTemplate.cs 。
  2. 将 AssemblyInfoTemplate.cs 的构建操作更改为
  3. 将带有 AssemblyFileVersion 的行修改为:

    [assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

  4. 考虑添加:

    [assembly: AssemblyInformationalVersion("Build date: $WCNOW=%Y-%m-%d %H:%M:%S$; Revision date: $WCDATE=%Y-%m-%d %H:%M:%S$; Revision(s) in working copy: $WCRANGE$$WCMODS?; WARNING working copy had uncommitted modifications:$.")],

    这将提供有关构建程序集的源的修订状态的详细信息。

  5. 将以下 Pre-build 事件添加到项目文件属性中:

    subwcrev "$(SolutionDir)." "$(ProjectDir)Properties\AssemblyInfoTemplate.cs" "$(ProjectDir)Properties\AssemblyInfo.cs" -f

  6. 考虑将 AssemblyInfo.cs 添加到 svn 忽略列表中。替换的修订号和日期将修改文件,这会导致微不足道的更改和修订,并且 $WCMODS$ 将评估为真。当然,AssemblyInfo.cs 必须包含在项目中。

针对 Wim Coenen 的反对意见,我注意到,与 Darryl 的建议相反,AssemblyFileVersion也不支持 2^16 以上的数字。构建将完成,但实际程序集中的属性文件版本将是 AssemblyFileVersion 模 65536。因此,1.0.0.65536 以及 1.0.0.131072 将产生 1.0.0.0 等。在此示例中,始终存在真实的修订号在 AssemblyInformalVersion 属性中。如果您认为这是一个重要问题,您可以省略第 3 步。

编辑:使用此解决方案一段时间后的一些附加信息。

  1. 它现在使用 AssemblyInfo.cst 而不是 AssemblyInfoTemplate.cs,因为它会自动具有Build Action选项None,并且不会使您的错误列表混乱,但您会失去语法突出显示。
  2. 我在 AssemblyInfo.cst 文件中添加了两个测试:

    #if(!DEBUG)    
        $WCMODS?#error Working copy has uncommitted modifications, please commit all modifications before creating a release build.:$ 
    #endif 
    #if(!DEBUG)       
        $WCMIXED?#error Working copy has multiple revisions, please update to the latest revision before creating a release build.:$ 
    #endif
    

    使用它,您通常必须在提交之后和成功发布构建之前执行完整的 SVN 更新。否则,$WCMIXED 将为真。这似乎是由于提交的文件在提交后重新进行了头部修订,但其他文件没有。

  3. 我怀疑 subwcrev 的第一个参数“$(SolutionDir)”,它设置了检查 svn 版本信息的范围,是否总是按预期工作。也许,它应该是 $(ProjectDir),如果您对每个单独的程序集都处于一致的修订版感到满意。

补充 回答@tommylux 的评论。

SubWcRev 可用于项目中的任何文件。如果你想在网页中显示修订信息,你可以使用这个 VersionInfo 模板:

public class VersionInfo
{       
    public const int RevisionNumber = $WCREV$;
    public const string BuildDate = "$WCNOW=%Y-%m-%d %H:%M:%S$";
    public const string RevisionDate = "$WCDATE=%Y-%m-%d %H:%M:%S$";
    public const string RevisionsInWorkingCopy = "$WCRANGE$";
    public const bool UncommitedModification = $WCMODS?true:false$;
}

添加一个与 AssemblyInfo.cst 类似的预构建事件,您将可以轻松访问所有相关的 SubVersion 信息。

于 2013-01-07T12:01:10.763 回答
10

这是可能的,但您不应该:程序集版本字符串的组件仅限于 16 位数字(最大 65535)。Subversion 版本号很容易变得比这个大,所以在某些时候编译器会突然抱怨。

于 2009-03-17T13:51:17.447 回答
6

看看 SubWCRev - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

程序集版本号通常在 assemblyinfo.cs

于 2008-08-15T12:29:04.327 回答
5

阅读/浏览这些文档:

使用 DotSVN 从 .NET 访问 Subversion 存储库

如何:编写任务

在 C# AssemblyInfo 文件中插入 SVN 版本和内部版本号

使用 Microsoft Build Engine 的自定义任务编译应用程序

第三个参考文献中提到的 MSBuildCommunityTasks svnversion 无法在 Mac 10.5.6 和 VS2008 C# 项目中使用 svn 在 Parallels 托管 Vista 中执行(即跨操作系统)。

编写您自己的任务以使用 DotSVN 从存储库中检索修订:

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using DotSVN.Common;
using DotSVN.Common.Entities;
using DotSVN.Common.Util;
using DotSVN.Server.RepositoryAccess;

namespace GetSVNVersion
{
    public class GetRevision : Task
    {
        [Required]
        public string Repository { get; set; }
        [Output]
        public string Revision { get; set; }

        public override bool Execute()
        {
            ISVNRepository repo;
            bool connected = true;
            try
            {
                repo = SVNRepositoryFactory.Create(new SVNURL(Repository));
                repo.OpenRepository();
                Revision = repo.GetLatestRevision().ToString();
                Log.LogCommandLine(Repository + " is revision " + Revision);
                repo.CloseRepository();
            }
            catch(Exception e)
            {
                Log.LogError("Error retrieving revision number for " + Repository + ": " + e.Message);
                connected = false;
            }
            return connected;
        }
    }
}

这种方式允许存储库路径为“file:///Y:/repo”,其中 Y: 是映射到 Vista 的 Mac 目录。

于 2009-03-17T08:21:08.737 回答
4

另一个答案提到SVN修订号可能不是一个好主意,因为数字大小的限制。

以下链接不仅提供了 SNV 修订号,还提供了日期版本信息模板。

将它添加到 .NET 项目很简单——只需要做很少的工作。

这是一个解决此问题的 github 项目 https://github.com/AndrewFreemantle/When-The-Version/downloads

以下 url 可能加载缓慢,但是如何使这项工作的分步说明(简单而简短的 3 或 4 个步骤)

http://www.fatlemon.co.uk/2011/11/wtv-automatic-date-based-version-numbering-for-net-with-whentheversion/

于 2012-02-11T02:40:58.757 回答
2

svn info,告诉你你正在使用的版本,你可以在 VS 中对你的项目进行“预构建”事件,通过运行 svn info 并使用自制的命令行应用程序解析其结果来生成 assemblyinfo.cs。

我以前做过,但很快切换到让 ccnet 将它作为变量传递给 nant。

于 2008-08-15T13:51:52.243 回答
2

如果您想更新项目 AssemblyInfo.cs 中的版本号,您可能会对本文感兴趣:

CodeProject:在 Visual Studio 项目中使用 Subversion 修订号

如果您启用 SVN 关键字,那么每次您签入项目时,Subversion 都会扫描您的文件中的某些“关键字”,并用一些信息替换关键字。

例如,在我的源文件的顶部,我将创建一个包含以下关键字的标题:

'$作者:$
'$Id:$
'$Rev:$

当我将此文件签入 Subversion 时,这些关键字将替换为以下内容:

'$Author: paulbetteridge $
'$Id: myfile.vb 145 2008-07-16 15:24:29Z paulbetteridge $
'$Rev: 145 $

于 2008-09-12T05:48:31.607 回答
0

您可以使用可以在所有项目中引用的共享程序集版本文件。

UppercuT这样做 - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx

这将使您了解如何在程序集中获取版本。

于 2009-06-08T16:34:24.253 回答