Visual Studio 2015 生成放置位置



我们公司最近将TFS更新到2015更新1。之后,名为 Drop folder 的上下文菜单项从已完成的构建中消失了。我一无所获,以及如何把它带回来。当我在完成的构建上单击Open时,VS 会打开 TFS 的 Web 版本,我在其中强制单击菜单并手动复制放置文件夹路径。所以我决定编写一个简单的扩展,将这个项目添加到菜单中。
一些谷歌搜索把我带到了这个页面。但是似乎示例代码很旧,在VS2015中不起作用:

IVsTeamFoundationBuild vsTfBuild = (IVsTeamFoundationBuild)GetService(typeof(IVsTeamFoundationBuild));
IBuildDetail[] builds = vsTfBuild.BuildExplorer.CompletedView.SelectedBuilds;

属性SelectedBuilds始终为空。我想它与VS2010的旧窗口有关。它返回作为IBuildDetail接口实例的项。
所以我在这里找到了这段代码:

var teamExplorer = (ITeamExplorer)ServiceProvider.GetService(typeof(ITeamExplorer));
var page = teamExplorer.CurrentPage;
var buildsPageExt = (IBuildsPageExt)page.GetExtensibilityService(typeof(IBuildsPageExt));
var build = buildsPageExt.SelectedBuilds[0];

这里buildIBuildModel接口的实例。它缺乏DropLocation属性。

有没有办法找到所选构建的放置位置?或者也许是最新版本?

您可以在 .NET 客户端库中使用 IBuildDedetail.DropLocation,用于 Visual Studio Team Services(和 TFS)。基本代码供您参考:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
namespace BuildAPI
{
    class Program
    {
        static void Main(string[] args)
        {
            string project = "http://xxx.xxx.xxx.xxx";
            TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri(project));
            IBuildServer ibs = tpc.GetService<IBuildServer>();
            var builds = ibs.QueryBuilds("TeamProjectName");
            foreach (IBuildDetail ibd in builds)
            {
                Console.WriteLine(ibd.DropLocation);
                Console.ReadLine();
            }
        }
    }
}

因此,在深入研究 TFS API 后,我最终得到了这个解决方法。

    private void MenuItemCallback(object sender, EventArgs e)
    {
        var context = (ITeamFoundationContextManager)ServiceProvider.GetService(typeof(ITeamFoundationContextManager));
        IBuildServer buildServer = context.CurrentContext.TeamProjectCollection.GetService<IBuildServer>();
        var teamExplorer = (ITeamExplorer)ServiceProvider.GetService(typeof(ITeamExplorer));
        var buildsPageExt = (IBuildsPageExt)teamExplorer.CurrentPage.GetExtensibilityService(typeof(IBuildsPageExt));
        var menuCommand = (MenuCommand)sender;
        if (menuCommand.CommandID.Guid == CommandSetCompleted)
        {
            foreach (var buildDetail in buildsPageExt.SelectedBuilds)
                Process.Start("explorer.exe", GetBuild(buildServer, buildDetail).DropLocation);
        }
        if (menuCommand.CommandID.Guid == CommandSetFavorite)
        {
            var definitions = buildsPageExt.SelectedFavoriteDefinitions.Concat(buildsPageExt.SelectedXamlDefinitions).ToArray();
            foreach (var build in GetLatestSuccessfulBuild(buildServer, definitions))
                Process.Start("explorer.exe", build.DropLocation);
        }
    }
    private IBuildDetail GetBuild(IBuildServer buildServer, IBuildModel buildModel)
    {
        Uri buildUri = new Uri(buildModel.GetType().GetProperty("UriToOpen").GetValue(buildModel).ToString());
        return buildServer.GetBuild(buildUri);
    }
    private IBuildDetail[] GetLatestSuccessfulBuild(IBuildServer buildServer, IDefinitionModel[] buildDefinitions)
    {
        var spec = buildServer.CreateBuildDetailSpec(buildDefinitions.Select(bd => bd.Uri));
        spec.MaxBuildsPerDefinition = 1;
        spec.QueryOrder = BuildQueryOrder.FinishTimeDescending;
        spec.Status = BuildStatus.Succeeded;
        var builds = buildServer.QueryBuilds(spec);
        return builds.Builds;
    }

相关内容

  • 没有找到相关文章

最新更新