.NET 程序集中的 SVN 修订版本,不带 CC.NET
-
08-06-2019 - |
题
有没有办法将 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 的回答,但不是很详细。
例子 :
- 将assemblyInfo.cs复制到项目文件夹中的gasemblyInfotemplate.cs 特性.
- 改变 构建行动 到 没有任何 对于 AssemblyInfoTemplate.cs。
将包含 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 忽略列表中。替换的修订号和日期将修改文件,这会导致不显着的更改和修订,并且 $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 而不是 AssemblyInfoTemplate.cs,因为它会自动具有 构建行动 选项 没有任何, ,它不会让你的错误列表变得混乱,但你会失去语法突出显示。
我已在 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。这似乎是由于提交的文件在提交后重新进行了头部修订,但其他文件则不然。
- 我有些怀疑 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 个步骤)
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
这将使您了解如何在程序集中获取版本。