8

我们使用的是 Team Foundation Service,而不是本地 TFS。我们的解决方案是在 Visual Studio 2012 上创建的。我现在的问题是我们希望所有程序集都具有相同的版本号(这部分已经通过使用链接到所有项目的 CommonAssemblyInfo.cs 来解决)。我现在面临的问题是我们需要在程序集版本的最后一位数字的 tfs 变更集编号(例如 1.0.0.4711,其中 4711 是变更集编号)。我找到了几个例子,但没有一个对我有用。是的,我特别在stackoverflow上搜索了很多。

我也不得不承认我从来没有研究过 MSBuild 脚本......

任何人都可以给我一个关于如何做到这一点的提示吗?例如,是否可以在 Team Foundation Service(不是本地 TFS)上使用 MSBuild 扩展包,如果,如何做到这一点?

和往常一样,时间是我最大的敌人……

4

3 回答 3

2

请注意,从 2010 年开始,Tfs 使用 Windows 工作流来构建包,工作流调用 msbuild 仅用于编译项目 - 虽然它可以通过这种方式传递变更集来 msbuild 其相当多的跃点。以下处理您的问题,但是所需的链接解决方案更复杂: 程序集版本是否可以随每个 TFS 2010 构建自动更新?

这是关于自定义构建活动的最佳系列教程之一,我相信作者也在堆栈上,特别是关于版本控制 http://www.ewaldhofman.nl/post/2010/05/13/Customize-Team- Build-2010-e28093-Part-5-Increase-AssemblyVersion.aspx

简而言之,您需要在编译源文件之前运行自定义活动,找到所有 CommonAssemblyInfo.cs 文件,将此列表提供给您的自定义活动,它会使用完整版本号的传递值或仅更改集和可选签入来修改内部的值更改(可能不会,因为那时您的更改集将不同步)。

您还可以查看https://tfsbuildextensions.codeplex.com/活动集,其中有 TfsVersion 活动,至少它会提供示例。

对此的功能需求应该可以通过团队资源管理器和源代码控制获得 - 自定义活动程序集和构建模板通常位于团队项目根目录中的文件夹中 - 此文件夹的位置是为构建控制器定义的,您可以通过团队资源管理器构建来更改它部分。

变更集可从值 BuildDetail.SourceGetVersion 获得,不确定这是否已在 2012 年修复/更改,但是在 2010 年有关于此值的 2 个问题

  1. 它不尊重默认构建模板中的 GetVersion 覆盖 - 如果使用覆盖,您将需要手动更新
  2. 运行最新版本(无覆盖)时,它将从 tfs 获取最后一个变更集编号 - 根据您的分支,这可能与构建分支的“最后一个”变更集不同。您将不得不忍受这一点,为每个构建提供覆盖或实施检查分支历史记录以获取最后一个变更集值并再次覆盖它的活动。

应该注意的是,GetVersion 应该能够接受任何 sourcespec 版本 - 变更集、日期、标签等。我还没有充分利用这一点来为您提供更多详细信息。

于 2013-02-06T11:15:28.927 回答
1

Colin Dembovsky 写了一篇关于使用 TFS 2013 构建定义中的新预构建脚本设置进行版本嵌入的精彩概述

Changeset 编号可以在环境变量TF_BUILD_SOURCEGETVERSION的预构建过程中轻松访问。我能够使用这个基于 Dembovsky 上述工作的脚本将 Changeset 值嵌入到我们的二进制文件中。(我使用的是 Perl,而不是 powershell,所以你可能不想看到它 ;-)

这种方法不需要对构建工作流程进行任何更改,这对我来说是一个巨大的胜利。

于 2014-06-11T17:41:06.453 回答
0

我使用了Wintellect 的解决方案——仅限 MSBuild,不需要 TFS 魔法。我还添加到自动生成的 CSharp 文件中:
[assembly:AssemblyInformationalVersion("$(BuildNumber)")]
所以我得到了 TFS 内部版本号。

于 2013-02-06T13:47:40.850 回答