6

我需要在 tfspreview 中获取 ChangeSetId 以进行持续集成。我只需要这个单一的号码。我尝试了所有我能找到的可能的 MSBuild 任务,但总是有另一个小问题阻止了我。

因为MSBuild.ExtensionPack.Tfs.TeamBuild我得到:

Could not load file or assembly 'Microsoft.TeamFoundation.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

并且TfsClient -task在 community-pack 中(正在生成以下 exec: tf.exe history . /StopAfter:1 /noprompt /format:detailed /recursive)我得到:

The specified task executable could not be run. The system cannot find the file specified

我的问题是;是否可以TF.exe在 tfspreview 服务器上执行?或者我可以让Microsoft.TeamFoundation.Client构建服务器上的程序集执行这两个任务之一吗?

4

3 回答 3

7

好吧,我在这里告诉您,无需编写您自己的自定义任务、使用 API 等,这是可能的...... StackOverflow 上有很多文章,但那些有解决方案的文章似乎不适用于 TFS 2010 . 我花了一整天的时间把头撞在墙上 :D

  1. 您需要安装 MSBuild 社区任务。确保从此处获取最新版本:https ://github.com/loresoft/msbuildtasks 。最新版本似乎已针对 TFS 2010 程序集进行了更新和重建。

  2. 您将使用 MSBuild.Community.Tasks.Tfs.TfsClient 任务。您收到有关无法运行可执行文件的错误的原因是因为这是一个 MSBuild ToolTask​​,您需要将可执行文件的路径作为属性 (ToolPath) 传递给任务。

  3. TfsClient 任务只是 tf.exe 的包装,并且该任务缺少许多可能的功能,用于以 MSbuild-y 方式处理开关。(并且此任务的文档不存在 - 我不得不查看代码)幸运的是,我发现您可以输入所有命令行开关作为命令本身的一部分。

  4. 所以你的最终电话看起来像这样......

    <MSBuild.Community.Tasks.Tfs.TfsClient ToolPath="$(PathToTfTool)"
                                       Command="history /collection:$(TfsProjectCollectionUrl) /stopafter:1 /version:T /format:detailed $(VersionControlPathForBuildWorkspace)"
                                       Recursive="true"
                                       >
    

    <Message Text="TFS ChangeSetNumber: $(ChangesetNumber)" />
    

在 22 次悲惨的失败构建或没有数据的构建之后,我终于得到了...... TFS ChangeSetNumber:41

雅虎!

从 Martin Woodward 得到命令: http ://www.woodwardweb.com/vsts/determining_the.html 确保您使用 /DETAILED 开关,否则它不会返回更改集。我必须查看任务的代码并弄清楚它是如何解析 tf.exe 的输出来解决这个问题的。

TfsClient 的代码供参考: https ://github.com/loresoft/msbuildtasks/blob/master/Source/MSBuild.Community.Tasks/Tfs/TfsClient.cs

于 2012-10-16T21:19:44.373 回答
2

这是对我有用的代码行……经过几个小时和几次尝试。不同之处在于我在

在哪里:

  • ToolPath ="C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE" - 取决于您使用的是 32 位还是 64 位。

  • $/WorkspacePath 我的工作空间的路径名,你可以使用 tf workspace 命令查看

    <MSBuild.Community.Tasks.Tfs.TfsClient ToolPath="C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE"
                                   Command="history /s:http://tfsserver01:8080/tfs/collectionname /stopafter:1 /version:T /format:detailed $/WorkspacePath"
                                   Recursive="true" >
      <Output TaskParameter="Changeset" PropertyName="ChangesetNumber"/>
    </MSBuild.Community.Tasks.Tfs.TfsClient>
    <Message Text="TFS ChangeSetNumber: $(ChangesetNumber)" />
    

但是感谢这个线程

于 2013-06-03T08:23:50.000 回答
0

MSBUILD 工作流程到底是什么样的?您是将此参数传递给 MSBUILD 还是某些自定义组件在 MSBUILD 运行时获取此信息?

我遇到了InformationNodeConverters类,它具有 GetAssociatedChangesets 方法,该方法接受IBuildDetail返回IChangesetSummary列表。这还要求您在执行 MSBUILD 任务之前已经关联了您的变更集。今晚我需要检查我的 TFSPreview 实例,看看我是否可以编辑构建模板,但我怀疑你应该能够使用这样的东西。

于 2012-08-13T14:06:29.913 回答