这是用于自动更新程序集中的修订信息的 C# 示例。它基于 Will Dean 的回答,不是很详细。
例子 :
- 将 AssemblyInfo.cs 复制到项目文件夹Properties中的 AssemblyInfoTemplate.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:$.")]
,
这将提供有关构建程序集的源的修订状态的详细信息。
将以下 Pre-build 事件添加到项目文件属性中:
subwcrev "$(SolutionDir)." "$(ProjectDir)Properties\AssemblyInfoTemplate.cs" "$(ProjectDir)Properties\AssemblyInfo.cs" -f
考虑将 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 步。
编辑:使用此解决方案一段时间后的一些附加信息。
- 它现在使用 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 信息。