我使用以下目标来执行此操作:
<Target Name="UpdateAssemblyInfoVersion" DependsOnTargets="GetRevision">
<CreateItem Include="**\AssemblyInfo.vb">
<Output TaskParameter="Include" ItemName="AssemblyFiles"/>
</CreateItem>
<Time>
<Output TaskParameter="Year" PropertyName="Year" />
</Time>
<FileUpdate Files="@(AssemblyFiles)"
Multiline="true"
Singleline="false"
Regex="(AssemblyVersion|AssemblyFileVersionAttribute|AssemblyFileVersion)\("([0-9]+\.[0-9]+\.[0-9]+)(\.[0-9]+)?"\)"
ReplacementText="$1("$2.$(Revision)")" />
<FileUpdate Files="@(AssemblyFiles)"
Multiline="true"
Singleline="false"
Regex="AssemblyCompany\(".*"\)"
ReplacementText="AssemblyCompany("My Company")" />
<FileUpdate Files="@(AssemblyFiles)"
Multiline="true"
Singleline="false"
Regex="AssemblyCopyright\(".*"\)"
ReplacementText="AssemblyCopyright("Copyright © 2009-$(Year) My Company")" />
</Target>
这将替换任何 AssemblyInfo 文件(在多个项目中)中的修订版(第 4 个数字)。它查看 AssemblyVersion AssemblyFileVersionAttribute 和 AssemblyFileVersion 标签,并使用 $(Revision) MSBuild 属性作为数字(我有另一个名为 GetRevision 的目标,它从 SVN 获取它并设置属性,所以这个取决于该目标)。正则表达式替换处理具有 3 位或 4 位数字的版本号(我有一堆只有 3 位,无论出于何种原因)。
它还设置/覆盖公司和版权信息,并将其设置为“我的公司”。对于版权,我很懒,所以它总是使用当前年份,所以我不必记得每年更新它(所以它说例如“Copyright (c) 2009-2010 My Company”)。
此目标需要MSBuild 社区任务扩展。
作为一项政策,所有签入到 SVN 的内容都以 .0 作为最后一个数字,并且只有 CI 服务器在构建时更改此值。这让我们可以快速区分开发人员创建的构建(绝不允许向客户提供)和 CI 服务器创建的“官方”构建之间的区别。