簡體   English   中英

Visual Studio 2015構建放置位置

[英]Visual Studio 2015 build drop location

我們公司最近將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接口實例的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客戶端庫中為Visual Studio Team Services(和TFS)使用IBuildDedetail.DropLocation 基本代碼供您參考:

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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM