在运行应用程序中获取TFS ChangeSet

时间:2016-02-01 06:41:32

标签: visual-studio tfs msbuild

我现在已经在网上搜索了大约2天。也许我没有使用正确的条款。我想做的是使用当前的TFS ChangeSet变量avaliable编译我的项目。我没有使用TFS Build。

我唯一没有成功的尝试是使用MSBuild Extension Pack的MSBuild任务来获取当前的ChangeSet(不仅是并将其放入程序集版本(修订版)。它因为我不使用而失败建立...... Here is the sample i have try

这是我第一次使用这种“任务”类编程,我不知道我是否可以在不设置TFS构建的情况下完成此操作。我无法设置Builds,因为我使用外部dll和项目,希望设置似乎很复杂。 (我的下一步是检查有关TFS Builds的更多信息)......

我在运行时需要这个值,这是因为我在错误报告功能中需要这个值。我希望自动完成此过程以避免错误。

(Visual Studio 2013,TFS [VisualStudio.com],Asp.net MVC 5)

解决方案: 坦克到朱利奥维安

这将获取当前解决方案的TFS ChangeSet,而不是最新的,并将其写入文件“TFS.cs”。 输出文件如下所示:

static class TFS { public static string ChangeSet { get { return "436"; }}} 

我在项目的根目录中创建了一个文件“TFS.targets”:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- 
    add this line to Target to run this only on Release:
    Condition="'$(Configuration)' == 'Release'" -->
  <Target Name="BeforeBuild" > 

    <!-- Get information on the latest build -->
    <Message Importance="High" Text="Getting TFS Chanset"/>
    <Exec Command="&quot;C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\tf.exe&quot; info &quot;$(SolutionPath)&quot; | FIND &quot;Changeset&quot;" ConsoleToMSBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="ChangesetLine" />
    </Exec>
    <PropertyGroup>
      <ChangesetNumber>$(ChangesetLine.Substring(13, $([MSBuild]::Subtract( $(ChangesetLine.IndexOf(';')) , 13 ))))</ChangesetNumber>
    </PropertyGroup>

    <Message Importance="High" Text="ChangeSet: '$(ChangesetNumber)'. Writing TFS.cs ..."/>
    <Exec Command="echo static class TFS { public static string ChangeSet { get { return &quot;$(ChangesetNumber)&quot;; }}} &gt; TFS.cs" Outputs="TFS.cs">
      <!--Add this file to the list to compile-->
      <!--<Output ItemName="Compile" TaskParameter="Outputs" />-->
    </Exec>
  </Target>
</Project>

然后我编辑了项目文件并在Project节点中添加了这一行:

<Import Project="$(MSBuildProjectDirectory)\TFS.targets"/>

(搜索“导入项目”,你会在项目中找到一些)

在第一次构建时,该文件将不在您的项目中。所以包括它来使用它。 (显示所有文件)。

如果您希望将其包含在版本中,请使用this question中的代码替换exec echo,但您需要安装MSBuildCommunityTasks

其他更新

经过一些测试后,它似乎没有显示目录/解决方案的最后一个ChangeSet。正确的命令是

tf history "c:\YourSolutionDir" /noprompt /recursive /stopafter:1

这个问题是它给你一个很难用MsBuild提取的响应。

我已经写了一个只返回变更集的控制台应用程序:

static void Main(string[] args)
        {

            Process p = new Process();
            // Redirect the output stream of the child process.
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\tf.exe";
            p.StartInfo.Arguments = "history \"" + args[0] + "\" /noprompt /recursive /stopafter:1";
            p.Start();
            // Do not wait for the child process to exit before
            // reading to the end of its redirected stream.
            // p.WaitForExit();
            // Read the output stream first and then wait.
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            var lines = output.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries);
            var last = lines.Last();
            var s = last.Split(' ');
            Console.WriteLine(s[0]);

        }

2 个答案:

答案 0 :(得分:1)

TeamBuild任务只能检索TFS构建的ChangeSet。你说你还没有使用TFS版本,所以不会工作。

您可以使用TFS API从TFS中提取变更集。

老实说,如果你打算去那,那将比使用TFS构建系统更困难。

答案 1 :(得分:1)

您可以调用tf命令获取有关TFVC文件和文件夹的信息。通过在映射到工作空间的本地目录中运行tf info命令,您可以获得大量有用的数据,例如 Local information: Local path : D:\Workspaces\xyz\mine.sln Server path: $/DefaultCollection/xyz/mine.sln Changeset : 6611 Change : none Type : file Server information: Server path : $/DefaultCollection/xyz/mine.sln Changeset : 6611 Deletion ID : 0 Lock : none Lock owner : Last modified: Saturday, March 14, 2015 09:38:44 Type : file File type : utf-8 Size : 1994

将命令嵌入MSBuild文件并不难,如下面的代码段所示 <Exec Command="tf info &quot;$(myChangesSetReferenceFile)&quot; | FIND &quot;Changeset&quot;" ConsoleToMSBuild="true"> <Output TaskParameter="ConsoleOutput" PropertyName="ChangesetLine" /> </Exec> <PropertyGroup> <ChangesetNumber>$(ChangesetLine.Substring(13, $([MSBuild]::Subtract( $(ChangesetLine.IndexOf(';')) , 13 ))))</ChangesetNumber> </PropertyGroup>

tf命令随团队资源管理器一起安装。