当前位置:  开发笔记 > 编程语言 > 正文

没有CC.NET的.NET程序集中的SVN修订版本

如何解决《没有CC.NET的.NET程序集中的SVN修订版本》经验,为你挑选了4个好方法。

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

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

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

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

这样的.NET可能吗?



1> R. Schreurs..:

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

示例:

    将AssemblyInfo.cs复制到项目文件夹Properties中的AssemblyInfoTemplate.cs .

    对于AssemblyInfoTemplate.cs,将Build Action更改为None.

    使用AssemblyFileVersion将行修改为:

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

    考虑添加:

    [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:$.")],

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

    将以下预构建事件添加到项目文件属性:

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

    考虑将AssemblyInfo.cs添加到svn ignore列表中.替换的修订号和日期将修改该文件,这将导致无关紧要的更改和修订,$ WCMODS $将评估为true.当然,AssemblyInfo.cs必须包含在项目中.

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

编辑:使用此解决方案一段时间后的一些其他信息.

    它现在使用AssemblyInfo.cst而不是AssemblyInfoTemplate.cs,因为它将自动具有Build Action选项None,并且它不会使你的错误列表混乱,但你会松开语法高亮.

    我在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将成立.这似乎是由于提交后的文件在提交后重新修改,但其他文件没有.

    我有一些疑问是否第一个参数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信息.


+1在我看来,这是最好的答案.

2> Wim Coenen..:

这是可能的,但你不应该:汇编版本字符串的组件限制为16位数字(最大65535).Subversion版本号很容易变得比那些大,所以在某些时候编译器突然会抱怨.


好点子.每天20次提交,这将持续8年.100次提交将持续不到2年.对于小型项目来说可能没问题.当然不适合大的.
另外,如果它破坏了与先前版本的兼容性,您应该只更改程序集版本 - 您不应该将构建版本信息放入程序集版本中.构建版本信息可以并且应该放入AssemblyFileVersion,它支持32位数字.请参见http://stackoverflow.com/questions/64602.

3> Will Dean..:

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

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


我添加了一个实现示例作为新答案.

4> 小智..:

阅读/浏览这些文档:

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

如何:编写任务

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

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

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

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


不幸的是,dotSVN不再被维护,其中一个遗漏的东西是http上的存储库.
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有