Mirza Merdovic Ответов: 1

Как загрузить решение из VSTS программно


Мне нужен способ загрузить исходный код из Visual Studio Team Services, в основном мне нужно решение в молнии, так же как вы можете загрузить его вручную, когда я нахожусь на сайте VSTS.

Что я уже пробовал:

Я прошел через ссылку VSTS API: Справочник по API проектов / REST для Visual Studio Team Services и Team Foundation Server[^ но, к сожалению, я не могу найти то, что мне нужно.

Обходной путь:

1. Оформить пост и получить партия товаров это вернет список всех файлов из главной ветви
Спасибо.
2. Повторите список и скачать файлы один за другим

но я действительно думал, что будет возможность загрузить zip-файл в папку или в ветку.

Member 14092117

можете ли вы предоставить решение для "как загрузить папку проекта в VSTS программно" означает, что при регистрации она должна быть отражена в репозитории VSTS

1 Ответов

Рейтинг:
4

Mirza Merdovic

В конце концов мне удалось решить эту проблему с помощью Клиентские библиотеки .NET для VSTS

Я использую эти 2 пакета: Microsoft.TeamFoundationServer.Клиент и Майкрософт.VisualStudio.Услуги.Клиент, они, как можно догадаться, являются обертками вокруг функциональных возможностей VSTS REST API.

Для того чтобы получить содержимое папки zipped из TFVC я использую метод:

Microsoft.TeamFoundation.SourceControl.WebApi.TfvcHttpClient.GetItemsBatchZipAsync(TfvcItemRequestData itemRequestData, Guid project)


Вот полный пример кода:

using System;
using System.IO;
using Microsoft.TeamFoundation.Core.WebApi;
using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.Common;

namespace BuildAndDeploy.GetSourceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "$/myproject/Main";
            var personalAccessToken = "***************************";
            var uri = new Uri("https://myproject.visualstudio.com");

            var credentials = new VssBasicCredential("", personalAccessToken);

            // You can use hard coded ProjectId or there is probably some better way to not always call this, but at the moment it's fine like this
            Guid projectGuid = GetProjectId(uri, credentials);

            using (var client = new TfvcHttpClient(uri, credentials))
            {
                var itemRequestData = Create(path);

                Stream item = client.GetItemsBatchZipAsync(itemRequestData, projectGuid).Result;

                SaveZippedContent(@"C:\Output\main.zip", item);
            }
        }

        private static Guid GetProjectId(Uri uri, VssBasicCredential credentials)
        {
            using (var client = new ProjectHttpClient(uri, credentials))
            {
                return client.GetProject("MoveDesk").Result.Id;
            }
        }

        private static TfvcItemRequestData Create(string folderPath)
        {
            return new TfvcItemRequestData
            {
                IncludeContentMetadata = true,
                IncludeLinks = true,
                ItemDescriptors =
                    new[]
                    {
                        new TfvcItemDescriptor
                        {
                            Path = folderPath,
                            RecursionLevel = VersionControlRecursionType.Full
                        }
                    }
            };
        }

        private static void SaveZippedContent(string saveToPath, Stream content)
        {
            var buffer = new byte[1024];

            try
            {
                using (var output = new FileStream(saveToPath, FileMode.Create))
                {
                    int readBytes;
                    while ((readBytes = content.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        output.Write(buffer, 0, readBytes);
                    }
                }
            }
            finally
            {
                content.Dispose();
            }
        }
    }
}


alsamflux

Получение WebException при операции чтения " запрос был прерван: запрос был отменен." Я использую большие буферы и продвигаюсь дальше.