2013-02-05 80 views
8

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

我也必须承认,我从来没有调查过的MSBuild脚本...

谁能请给我如何做到这一点的提示? 是否有可能在团队基础服务(不是本地TFS)上使用MSBuild扩展包,以及如何做到这一点?

与往常一样,时间是我最大的敌人......

回答

2

注意,从2010年TFS使用的Windows工作流构建工作流调用的MSBuild只编译项目包 - 而其可能通过变更集这种方式来msbuild更具跳跃性。 在与你的问题的交易,但链接的解决方案更复杂,需要: Can assembly version been automatically updated with each TFS 2010 Build?

这是最好的一系列定制教程共建活动,笔者在栈以及我相信,一个specificly有关的一个版本 http://www.ewaldhofman.nl/post/2010/05/13/Customize-Team-Build-2010-e28093-Part-5-Increase-AssemblyVersion.aspx

总之你需要一个自定义活动上的源文件编译运行之前,找到所有CommonAssemblyInfo.cs文件,养活这个名单到您的自定义活动,它的完整版本号传递的值或修改里面的值只有changeset和optionaly检查更改(可能不会,因为您的更改集将不同步)。

你也可以看看https://tfsbuildextensions.codeplex.com/这套活动中有TfsVersion活动,至少它会提供例子。

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

变更集可从价值BuildDetail.SourceGetVersion,不知道这是固定/ 2012年改但有这个价值2期,2010年

  1. 其犯规方面GetVersion在默认的编译模板覆盖 - 你会手动需要更新,如果覆盖
  2. 当运行最新版本(没有覆盖)它会从tfs得到最后的变更集编号 - 取决于你的分支这可能不是'最后'变更为分支构建。您将不得不忍受这一点,为每个构建提供覆盖,或实施检查最后变更集值的分支历史记录并重新覆盖它的活动。

应该指出的是,GetVersion应该能够接受任何sourcespec版本 - 变更集,日期,标签等。我没有玩过这足以提供更多的细节给你。

+0

非常感谢,也有你的文章了一些非常有用的链接! – AlexK

+0

不过,我还没有找到工作的方式来获得变更集数...我已经发现了几个帖子,让使用标签的似乎并不在VS2012的工作......这就是处罚工作采用尖端技术。 – AlexK

+0

编辑有关更改集编号 – drk

0

我用Wintellect's solution - 的MSBuild只,没有TFS魔术需要。我还加入了对自动生成CSharp文件:
[assembly:AssemblyInformationalVersion("$(BuildNumber)")]
所以我得到的TFS版本号。

+3

但请注意,BuildNumber未更改 - 它可能根本不包含更改集 - 它在默认实现中不起作用。 – drk

0

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

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

这种方法不需要对构建工作流,这使得它的一个重要的胜利对我来说任何变化。

+0

那么你的变更集编号脚本的版本是什么样的? –