有没有办法将 SVN 存储库修订号包含在 .NET 程序集的版本字符串中?类似于 Major.Minor.SVNRev

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

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

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

对于 .NET 来说,这样的事情可能吗?

有帮助吗?

解决方案

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

程序集版本号通常位于 assemblyinfo.cs 中

其他提示

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

例子 :

  1. 将assemblyInfo.cs复制到项目文件夹中的gasemblyInfotemplate.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. 将以下预构建事件添加到项目文件属性中:

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

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

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

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

  1. 它现在使用 AssemblyInfo.cst 而不是 AssemblyInfoTemplate.cs,因为它会自动具有 构建行动 选项 没有任何, ,它不会让你的错误列表变得混乱,但你会失去语法突出显示。
  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 将为 true。这似乎是由于提交的文件在提交后重新进行了头部修订,但其他文件则不然。

  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 的事件一样,您将可以轻松访问所有相关的子版本信息。

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

阅读/浏览这些文档:

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

如何:写一个任务

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

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

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

编写您自己的任务以使用 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 目录。

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

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

将其添加到 .NET 项目非常简单 - 只需要做很少的工作。

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

以下网址可能加载缓慢,但分步说明了如何完成此工作(简单且简短的 3 或 4 个步骤)

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

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

我之前已经这样做过,但很快就切换到让 ccnet 将其作为变量传递给 nant。

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

代码项目:在 Visual Studio 项目中使用 Subversion 修订版号

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

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

'$作者:$
'$ID:$
'$修订:$

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

'$作者:保罗贝特里奇$
'$ID:myfile.vb 145 2008-07-16 15:24:29Z 保罗贝特里奇 $
'$Rev:145 美元

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

上勾拳 做这个 - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top