有没有办法在.NET程序集的版本字符串中包含SVN存储库修订号?像Major.Minor.SVNRev
这样的东西我已经看到提到用CC.NET这样的东西(虽然实际上是在ASP.NET上),但有没有办法在没有任何额外软件的情况下做到这一点?在使用构建批处理脚本之前,我在C / C ++中做了类似的事情,但是通过读取版本号来完成,然后让脚本每次都写出一个名为“ver.h”的文件,其效果为:
#define MAJORVER 4
#define MINORVER 23
#define SOURCEVER 965
然后我们将使用这些定义来生成版本字符串。
这样的.NET可能吗?
答案 0 :(得分:28)
这是用于自动更新程序集中的修订信息的C#示例。它基于Will Dean的答案,这不是很精细。
示例:
使用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以上的数字。构建将完成,但实际程序集中的属性文件版本将是AssemblyFileVersion模65536.因此,1.0.0.65536以及1.0.0.131072将产生1.0.0.0等。在此示例中, AssemblyInformationalVersion属性中始终存在真正的修订号。如果你认为这是一个重大问题,你可以省略第3步。
编辑:使用此解决方案一段时间后的一些其他信息。
我在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将成立。这似乎是由于提交后的文件在提交后重新修订,但其他文件没有。
<强>加成强> 回答@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 :(得分:10)
有可能但你不应该:汇编版本字符串的组件限制为16位数字(最大65535)。 Subversion版本号很容易变得比那些大,所以在某些时候编译器突然会抱怨。
答案 2 :(得分:6)
看看SubWCRev - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
程序集版本号通常在assemblyinfo.cs
中答案 3 :(得分:5)
阅读/浏览这些文档:
Accessing the Subversion repository from .NET using DotSVN
Insert SVN version and Build number in your C# AssemblyInfo file
Compiling Apps With Custom Tasks For The 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目录。
答案 4 :(得分:4)
另一个答案提到SVN修订号可能不是一个好主意,因为数量的限制。
以下链接不仅提供SNV修订号,还提供日期版本信息模板。
将它添加到.NET项目很简单 - 只需要做很少的工作。
这是一个解决这个问题的github项目 https://github.com/AndrewFreemantle/When-The-Version/downloads
以下网址可能会缓慢加载,但是如何使这项工作逐步解释(简单和简短的3或4步)
答案 5 :(得分:2)
svn info,告诉你你所使用的版本,你可以在你的项目中在VS中进行“预构建”事件,通过运行svn info并使用自己开发的命令行应用程序解析其结果来生成assemblyinfo.cs
我之前已经这样做了,但很快就切换到让ccnet将它作为变量传递给nant。
答案 6 :(得分:2)
如果您想更新项目AssemblyInfo.cs中的版本号,您可能对本文感兴趣:
CodeProject: Use Subversion Revision numbers in your Visual Studio Projects
如果启用SVN关键字,则每次签入项目时,Subversion都会扫描您的文件以查找某些“关键字”,并用一些信息替换关键字。
例如,在我的源文件的顶部,我将创建一个包含以下关键字的标头:
“$作者:$
“$ ID:$
“$修订:$当我将此文件检入Subversion时,这些关键字将替换为以下内容:
'$作者:paulbetteridge $
'$ Id:myfile.vb 145 2008-07-16 15:24:29Z paulbetteridge $
'$ Rev:145 $
答案 7 :(得分:0)
您可以使用可在所有项目中引用的共享程序集版本文件。
UppercuT执行此操作 - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx
这将让您了解如何在程序集中获取版本。