需要有关使用 TFSBuild 保持内部版本号和程序集同步的帮助
本文关键字:版本号 内部 程序集 同步 帮助 TFSBuild | 更新日期: 2023-09-27 18:34:34
我正在学习团队构建,工作流和MSBuild TFS2010。我对工作流有了大致的了解,最近能够成功地进行测试构建。
现在,我需要一些帮助来保持构建版本和程序集版本控制同步。我一直在阅读吉姆·兰姆(Jim Lamb(和约翰·罗宾斯(John Robbins(关于这个主题的几篇博客,但是我现在感到比刚开始时更困惑。Jim Lamb 的博客讨论了使用自定义活动,该活动使用当前日期来设置版本号,John Robbins 的博客讨论了获取最后一个程序集版本并在 MSBuild 中执行所有操作,因为没有额外的依赖项。
目前我们使用 4 位版本号,例如 3.8.0.2,然后我们增加每个构建的最后一个数字。我们使用此版本来同步所有程序集。我们想保持这种格式,我想在工作流中处理我的所有版本控制,但我不知道如何以这种方式从程序集读取最新版本。我认为这将需要编写自定义活动,但是我将使用什么方法来读取最新版本?
提前感谢!吉姆
Stuart Preston在他的博客上解释了一种设置程序集信息的简单方法:http://stuartpreston.net/blog/2010/05/02/simple-assembly-versioning-with-team-build-2010/
编辑:
上面的链接已死,这是缓存版本:
发布者 Stuart Preston on May 2, 2010 在 Team Foundation Server
有许多更复杂的方法可以实现这一点,但似乎没有一种方法能完全满足我的需求,因此我在这里介绍了另一种使用 Team Build 2010 进行程序集版本控制的方法。 我希望我的团队内部版本号与我的程序集版本完全匹配(而不是派生(,如下所示:
(图片仅供参考(
这就是我的做法。 首先,我在构建定义中自定义内部版本号格式:
(图片仅供参考(
就我而言,我决定对其进行自定义,以便明确添加主要和次要版本号"0.1"。 这让我可以控制版本号的前两部分,这就是我想要实现的目标。 我还添加了宏$(Month)$(DayOfMonth)
,并在它前面有一个1
。 对于 2010 年 5 月 2 日,这将生成一个数字 10502。(我在这里不使用全年的原因是,对于今天,它将生成一个100502的内部版本号,并且文件版本号不能高于 65335(。
当我决定使用 0.2、0.3 或 1.0 版本时,我所要做的就是在此处增加内部版本号并保存定义,我也很乐意在年份变化时增加数字。我说很简单!
内部版本号格式的最后一部分保持原样(即修订号在当天的每个内部版本递增 1,并在第二天重置(。
现在我们需要做的就是在针对解决方案运行时检索此版本号MSBuild
拆分版本号并将数字部分放入Properties'AssemblyVersion.cs
文件中(您需要先注释掉该文件中的AssemblyFileVersion
行并将其签入(。
这是您需要插入.csproj
文件中的片段(您必须检查它,然后在记事本或您喜欢的文本编辑器中打开它(。
<UsingTask
TaskName="Microsoft.TeamFoundation.Build.Tasks.GetBuildProperties"
AssemblyFile="$(MSBuildProgramFiles32)'Microsoft Visual Studio 10.0'Common7'IDE'PrivateAssemblies'Microsoft.TeamFoundation.Build.ProcessComponents.dll"
Condition="' $(BuildUri) '!=' '"/>
<Target Name="BeforeBuild" Condition="' $(BuildUri) '!=' '">
<GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
<Output TaskParameter="BuildNumber" PropertyName="BuildNumber" />
</GetBuildProperties>
<PropertyGroup>
<BuildNumberSplitLocation>$([MSBuild]::Add($(BuildNumber.LastIndexOf('_')),1))</BuildNumberSplitLocation>
</PropertyGroup>
<ItemGroup>
<AssemblyVersionLines Include="[assembly:AssemblyFileVersion("$(BuildNumber.Substring($(BuildNumberSplitLocation)))")]" />
</ItemGroup>
<Exec Command="attrib -r "$(ProjectDir)'Properties'AssemblyInfo.cs"" ContinueOnError="false" />
<Message Text="Lines being added: @(AssemblyVersionLines)" Importance="high" />
<WriteLinesToFile File="$(ProjectDir)'Properties'AssemblyInfo.cs" Lines="@(AssemblyVersionLines)" />
</Target>
(参考完(
他修改csproj
文件,以在生成之前使用 TFS
传入的值更新AssemblyInfo.cs
文件,以便根据 MMDDRev
的排列对程序集进行版本控制
您的情况有点不同,因为您需要自定义内部版本号。 为此,您可以将BuildNumberFormat
修改为3.8.0.$(Rev:.r)
。 由于修订是唯一更改的内容,因此TFS
会自动为您增加修订版。
如果要更新3.8.0.
部分,可以再次手动编辑内部版本号格式。 否则,您将需要一个解决方案来存储和解析内部版本号,作为csproj
中BeforeBuild
任务的一部分。