tfspreview上的tf.exe

时间:2012-07-31 20:19:28

标签: tfs msbuild tfsbuild msbuildcommunitytasks msbuildextensionpack

我需要在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(生成以下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

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

3 个答案:

答案 0 :(得分: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)" />
    
  5. 在22个悲惨的失败构建或构建没有数据之后我终于得到了......   TFS ChangeSetNumber:41

    YAHOO!

    得到马丁伍德沃德的命令: http://www.woodwardweb.com/vsts/determining_the.html 请确保您使用/详细的开关或它返回CHANGESET。我不得不查看该任务的代码,并弄清楚它是如何解析tf.exe的输出来解决这个问题的。

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

答案 1 :(得分:2)

以下是为我工作的代码行......经过几个小时和几次尝试。区别在于我在其中创建了一个输出TaskParameter元素

其中:

  • 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)" />
    

但是感谢这个帖子

答案 2 :(得分:0)

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

我遇到过班级InformationNodeConverters,其中GetAssociatedChangesets方法接收IBuildDetail并返回IChangesetSummary列表。这还需要在进入MSBUILD任务之前已将关联集更改为关联。我今晚需要检查我的TFSPreview实例,看看我是否可以编辑构建模板,但我怀疑你应该可以使用这样的东西。