捕获 msbuild tf.exe 变更集/最新

Capture msbuild tf.exe changeset /latest

在 MSBuild 文件中,我想从以下命令的输出中提取 changeset 数字到 $(parameter) 值;

<Exec Command="c:\path\tf.exe changeset /latest /i" />

在我的构建脚本中,我可以在结果的第一行看到变更集编号:

Changeset: 7539
User: John Doe Date: 23 September 2015 17:03:19

Comment:
some check-in comment

Items: [[List of items here]]

Work Items: [[List of linked work items here]]

我觉得我很接近,想要最简单的解决方案。如果有更好的选择,我可以使用 MSBuild.ExtensionPack 或 MSBuild.Community 任务。

只获取变更集编号,请尝试以下步骤:(代码引用自link):

  1. 在机器上下载并安装MSBuildExtensionPack
  2. 将以下代码添加到 .csproj 文件(假设您正在使用 C# 项目)。注意:您需要为 AssemblyFile 属性 更改机器上安装 MSBuild.ExtensionPack.TaskFactory.PowerShell.dll 的文件夹路径。

  <UsingTask TaskFactory="PowershellTaskFactory" TaskName="Changeset" AssemblyFile="C:\Program Files\MSBuild\ExtensionPack.0\MSBuild.ExtensionPack.TaskFactory.PowerShell.dll">
    <ParameterGroup>
      <changeset Output="true" />
    </ParameterGroup>
    <Task>
      <![CDATA[  
       $tf = & "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\tf.exe" history . /r /noprompt /stopafter:1 /version:W 
       $changeset=$tf[2].Split(" ")[0] 
       ]]>
    </Task>
  </UsingTask>
  <Target Name="TestBuild">
    <Changeset>
      <Output TaskParameter="changeset" PropertyName="changeset" />
    </Changeset>
    <Message Importance="High" Text="Changeset:++++++ ::::: $(changeset)" />
  </Target>

您可以使用一些新的标准 MsBuild 功能来实现此目的。

<PropertyGroup> 
  <TF>&quot;$(VS140COMNTOOLS)..\IDE\tf.exe&quot;</TF> 
</PropertyGroup>
<Target Name="GetVersion">
  <Exec Command="$(TF) changeset /latest /i" ConsoleToMSBuild="true">
    <Output TaskParameter="ConsoleOutput" PropertyName="TfOutput" />
  </Exec>
  <PropertyGroup>
    <Changeset>$(TfOutput.Split(';')[0].Substring(11))</Changeset>
  </PropertyGroup>
  <Message Importance="high" Text="ChangeSet is $(Changeset)" />
</Target>