使用托管TFS将版本号更改为版本信息

时间:2013-02-05 14:10:49

标签: tfs msbuild visual-studio-2012 tfsbuild azure-devops

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

我还必须承认我从未查看过MSBuild脚本......

任何人都可以给我一个如何实现这一目标的提示吗? 例如,是否可以在Team Foundation Service(而不是本地TFS)上使用MSBuild扩展包以及是否,如何执行此操作?

一如既往,时间是我最大的敌人......

3 个答案:

答案 0 :(得分:2)

请注意,从2010年开始,Tfs使用Windows工作流来构建程序包,工作流调用msbuild仅用于编译项目 - 虽然可以通过这种方式将变更集传递给msbuild其更多的跃点。 以下是您的问题,但链接的解决方案需要更复杂: Can assembly version been automatically updated with each TFS 2010 Build?

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

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

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

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

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

  1. 它不违反默认构建模板中的GetVersion覆盖 - 如果使用覆盖,您将手动更新
  2. 当运行最新版本(无覆盖)时,它将从tfs获取最后一个变更集编号 - 取决于您的分支机构,这可能与最后一个'构建分支的变更集。您将不得不忍受这一点,为每个构建提供覆盖或实现活动,以检查分支历史记录中的最后一个变更集值并重新覆盖它。
  3. 应该注意的是,GetVersion应该能够接受任何sourcepec版本 - 变更集,日期,标签等。我没有玩这个足以提供更多细节给你。

答案 1 :(得分:1)

Colin Dembovsky写了great overview of doing version embedding using the new pre-build script setting in TFS 2013 build definitions

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

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

答案 2 :(得分:0)

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