Поделиться через


Расширение системы управления версиями

Visual Studio Team Foundation Server 2010 представляет изменение в архитектуре Team Foundation Server.Перед тем как читать образец кода в этом разделе, необходимо понимать архитектуру Team Foundation Server по крайней мере на очень высокопоставленном и следующую информацию следует понять назначение командных проектов и коллекций командных проектов в коллекции проектов.Это организационную изменение позволяет выполнять операции управления версиями для связанных элементов в контексте коллекции командных проектов.

Основная организационная структура в Team Foundation Server 2010 коллекции командных проектов.Коллекция командных проектов группирование командных проектов в организационную структуру, которые можно использовать для определения и управления группами в составе проекты, которые совместно используют ресурсы или базу кода.Преимущество этого типа организационной иерархии, что элемент управления командными проектами будет более эффективны при группируете они совместно и присвоить им ресурсы.Операции, как разрешить разветвление или слияние кода, резервного копирования и восстановления данных и отчетности данные проекта будет проще, поскольку они относятся к базе данных.Дополнительные сведения о коллекциях командных проектов в Team Foundation Server 2010 см. в разделе Organizing Your Server with Team Project Collections.

Содержание раздела

ПримечаниеПримечание

Можно расширить путем доступа к Team Foundation (подсистема контроля версий) и обновление элементов в репозитории управления версиями и в рабочую область на локальном компьютере для создания пользовательских политик возврата и применить их к командному проекту.Используя преимущества наследования необходимо заменить существующую функциональность с собственной реализации политики, так как он применяется к элементу управления версиями.Дополнительные сведения см. на следующей странице на веб-сайте корпорации Майкрософт. Практическое руководство. Создание пользовательских политик возврата.

Пример: Доступ к элементам в репозитории управления версиями

Следующий пример использует объект VersionControlServer для перечисления каждая версия каждого файла .xaml в репозитории управления версиями.

Чтобы использовать этот пример

  1. Создайте консольное приложение и добавьте ссылки на следующие сборки:

  2. Замените содержимое (Program.cs или Module1.vb) с данным примером.

using System; 
using System.Text; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.Framework; 
using Microsoft.TeamFoundation.VersionControl.Client; 

namespace VCSample
{
    class Program
    {
        static void Main(string[] args) 
        {
            // Connect to the team project collection and the server that hosts the version-control repository. 
            TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(
               new Uri("https://Server:8080/tfs/DefaultCollection"));
            VersionControlServer vcServer = tpc.GetService<VersionControlServer>(); 

            // List all of the .xaml files.
            ItemSet items = vcServer.GetItems("$/*.xaml", RecursionType.Full); 
            foreach(Item item in items.Items) 
            {
                Console.Write(item.ItemType.ToString());
                Console.Write(": ");
                Console.WriteLine(item.ServerItem.ToString());
            }
        }
    }
}
Imports System
Imports System.Text
Imports Microsoft.TeamFoundation.Client
Imports Microsoft.TeamFoundation.VersionControl.Client

Module Module1

    Sub Main()
        ' Connect to the team project collection and the server that hosts the version-control repository.
        Dim tfsUri As Uri
        tfsUri = New Uri("https://Server:8080/tfs/DefaultCollection")

        Dim tpc As New TfsTeamProjectCollection(tfsUri)

        Dim vcServer As VersionControlServer
        vcServer = tpc.GetService(Of VersionControlServer)()

        ' List all of the .xaml files.
        Dim items As ItemSet
        items = vcServer.GetItems("$/*.xaml", RecursionType.Full)
        Dim item As Item
        For Each item In items.Items
            System.Console.Write(item.ItemType.ToString())
            System.Console.Write(": ")
            System.Console.WriteLine(item.ServerItem.ToString())
        Next
    End Sub

End Module

Пример: элементы обновления в рабочей области

Можно работать с файлами в области путем выполнения операций, таких как получить, извлекается и вернете программно.В следующем примере показано, как получить последнюю версию файлов в рабочей области.

Чтобы использовать этот пример

  1. В предыдущем примере найдите раздел кода, который перечисляет файлы .xaml и замените его следующим кодом.

  2. Замените WorkspaceName с именем области, которая обычно совпадает с именем компьютера, который содержит рабочую область.

  3. Замените имя пользователя с полным именем пользователя, имеющего рабочую область.

Дополнительные сведения см. в разделах Workstation.GetLocalWorkspaceInfo и Управление рабочими областями.

// Get the workspace that is mapped to c:\BuildProcessTemplate
WorkspaceInfo wsInfo = Workstation.Current.GetLocalWorkspaceInfo(
   vcServer, @"WorkspaceName", @"UserName");
Workspace ws = vcServer.GetWorkspace(wsInfo); 

// Update the workspace with most recent version of the files from the repository.
GetStatus status = ws.Get();
Console.Write("Conflicts: ");
Console.WriteLine(status.NumConflicts);
' Get the workspace that is mapped to c:\BuildProcessTemplate
Dim wsInfo As WorkspaceInfo
wsInfo = Workstation.Current.GetLocalWorkspaceInfo(vcServer, "WorkspaceName", "UserName")
Dim ws As Workspace
ws = vcServer.GetWorkspace(wsInfo)

' Update the workspace with the most recent version of the files from the repository.
Dim status As GetStatus
status = ws.Get
Console.Write("Conflicts: ")
Console.WriteLine(status.NumConflicts)

Можно также получить рабочую область, сопоставлятьа к папке на локальном компьютере, передавая полный путь к Workstation.GetLocalWorkspaceInfo этой папки.

WorkspaceInfo wsInfo = Workstation.Current.GetLocalWorkspaceInfo(@"c:\MyWorkspace");
Dim wsInfo As WorkspaceInfo
wsInfo = Workstation.Current.GetLocalWorkspaceInfo("c:\MyWorkspace")

Пример: Добавление элементов в репозитории управления версиями

Можно создать файл и установить его в систему управления версиями с помощью добавление и методы возврата.

Предупреждающее замечаниеВнимание

Код вызывает исключение, если отсутствуют разрешения в области чтения и вернуть файлы.Эти разрешения разрешения системы управления версиями Чтение и Checkin в Обозреватель управления исходным кодом.

В данном образце можно вызывать следующие методы:

  • Во-первых, указывается коллекции проектов в Team Foundation Server путем вызова [M:Microsoft.TeamFoundation.Client.RegisteredTfsConnections.GetProjectCollection()] или [M:Microsoft.TeamFoundation.Client.RegisteredTfsConnections.GetProjectCollections()].

  • После определения коллекции проектов, затем следует указать каждую коллекцию командных проектов путем вызова [M:Microsoft.TeamFoundation.Client.TfsConfigurationServer.GetTeamProjectCollection()].

  • В пределах коллекции командных проектов, необходимо указать отдельные командные проекты с помощью вызова [M:Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer.GetAllTeamProjects()].

  • Для каждого командного проекта можно получить, связанная рабочей области путем вызова [M:Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer.GetWorkspace()] или [M:Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer.CreateWorkspace()], а затем сопоставлении рабочую область на локальный диск, вызвав [M:Microsoft.TeamFoundation.VersionControl.Client.Workspace.CreateMapping()].

  • Для копирования файлов на локальный диск, нужно вызвать [M:Microsoft.TeamFoundation.VersionControl.Client.Workspace.Get()] для области.

Затем можно добавить в систему управления версиями при наличии соответствующих разрешений.

Чтобы использовать этот пример

  1. Создайте консольное приложение C#, а затем добавьте ссылки на следующие сборки:

  2. Замените содержимое Program.cs с кодом примера.

  3. Измените значение Uri к имени сервера приложение- уровня в вашей среде.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace VControl
{
    class Program
    {
        static void Main(string[] args)
        {
            List<RegisteredProjectCollection> projectCollections;

            if (args.Count() == 0)
            {
                // Try the default URI as the name of a registered project collection.
                projectCollections = new List<RegisteredProjectCollection> { RegisteredTfsConnections.GetProjectCollection(new Uri("https://Server:8080/tfs/DefaultCollection")) };   
            }
            else
            {
                // Get all registered project collections
                projectCollections = new List<RegisteredProjectCollection>(RegisteredTfsConnections.GetProjectCollections());
            }
            
            foreach (var registeredProjectCollection in projectCollections)
            {
                TfsTeamProjectCollection projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(registeredProjectCollection);
                
                Workspace workspace = null;
                Boolean createdWorkspace = false;
                String newFolder = String.Empty;
                try
                {
                    VersionControlServer versionControl = projectCollection.GetService<VersionControlServer>();
                    
                    var teamProjects = new List<TeamProject>(versionControl.GetAllTeamProjects(false));
                    
                    if (teamProjects.Count < 1)
                        continue;
                    String workspaceName = String.Format("{0}-{1}", Environment.MachineName, "Test");
                    try
                    {
                        workspace = versionControl.GetWorkspace(workspaceName, versionControl.AuthorizedUser);
                    }
                    catch (WorkspaceNotFoundException)
                    {
                        workspace = versionControl.CreateWorkspace(workspaceName, versionControl.AuthorizedUser);
                        createdWorkspace = true;
                    }
                    var serverFolder = String.Format("$/{0}", teamProjects[0].Name);
                    var localFolder = Path.Combine(Path.GetTempPath(), "Test");
                    var workingFolder = new WorkingFolder(serverFolder, localFolder);

                    // Create a workspace mapping.
                    workspace.CreateMapping(workingFolder);

                    if (!workspace.HasReadPermission)
                    {
                        throw new SecurityException(
                            String.Format("{0} does not have read permission for {1}", versionControl.AuthorizedUser, serverFolder));
                    }
                    
                    // Get the files from the repository.
                    workspace.Get();

                    // Create a file
                    newFolder = Path.Combine(workspace.Folders[0].LocalItem, "For Test Purposes");
                    Directory.CreateDirectory(newFolder);
                    String newFilename = Path.Combine(newFolder, "Safe To Delete.txt");

                    // Determine whether the user has check-in permissions.
                    if (!workspace.HasCheckInPermission)
                    {
                        throw new SecurityException(
                            String.Format("{0} does not have check-in permission for workspace {1}", workspace.VersionControlServer.AuthorizedUser,
                            workspace.DisplayName));
                    }

                    try
                    {
                        // Create the file.
                        using (var streamWriter = new StreamWriter(newFilename))
                        {
                            streamWriter.WriteLine("Revision 1");
                        }

                        workspace.PendAdd(Path.GetDirectoryName(newFilename), true);

                        //  Create a list of pending changes.
                        var pendingAdds = new List<PendingChange>(workspace.GetPendingChanges());
                        
                        //  Enumerate the pending changes
                        pendingAdds.ForEach(add => Console.WriteLine("\t{0}: {1}", add.LocalItem,
                            PendingChange.GetLocalizedStringForChangeType(add.ChangeType)));
                        
                        // Check in the items that you added.
                        int changesetForAdd = workspace.CheckIn(pendingAdds.ToArray(), "Initial revision");
                        Console.WriteLine("Checked in changeset {0}", changesetForAdd);
                    }
                    catch (IOException ex)
                    {
                        Console.Error.WriteLine("Error writing {1}: {0}", ex.Message, newFilename);
                        throw;
                    }
                    catch (VersionControlException ex)
                    {
                        Console.Error.WriteLine("Error adding file: {0}", ex.Message);
                        throw;
                    }
                }
                finally 
                {
                    if ((workspace != null) && createdWorkspace)
                    {
                        workspace.Delete();
                    }
                    if (!String.IsNullOrEmpty(newFolder) && Directory.Exists(newFolder))
                    {
                        Directory.Delete(newFolder);
                    }
                }
                break;
            }
            
        }
    }
}

Пример: Изменение элементов

Можно изменить существующий файл в системе управления версиями с помощью следующего кода, который вызывает методы PendEdit и CheckIn.В этом примере показано, как использовать объектную модель для редактирования и вернуть существующий файл.Вы измените образец кода для создания файл и затем заменить некоторые строки кода в этом примере код в этом примере.Кроме того, данный пример вставляет спецификации элемента, используемые для добавления пользовательского свойства в файл.

Чтобы использовать этот пример

  • Открыть консольное приложение C#, созданный в примере Add a File to Version Control, а затем заменить внутренний попытка блок следующим кодом:
try
{
    // Check out and modify a file.
    workspace.PendEdit(newFilename);

    using (var streamWriter = new StreamWriter(newFilename))
    {
        streamWriter.WriteLine("Revision 2");
    }

    // Get the pending change, and check in the new revision.
    var pendingChanges = workspace.GetPendingChanges();
    int changesetForChange = workspace.CheckIn(pendingChanges, "Modified file contents");
    Console.WriteLine("Checked in changeset {0}", changesetForChange);
}

Можно добавить свойство к файлу, который был создан в этом примере.Вызовом метода SetVersionedItemProperty, можно установить свойство в выбор файла.В примере используется параметр itemSpec для указания пути к файлам и папкам.В этом случае можно указать локальный путь, хотя также можно использовать этот параметр для указания пути в репозитории.Можно также указать свойства и значение для него.

Предупреждающее замечаниеВнимание

Следует проявлять осторожность при использовании локальный путь для спецификации элемента.Будет создано исключение при указании сопоставление, которое также не существует в хранилище.

//Add a custom property to this file.
versionControl.SetVersionedItemProperty( new ItemSpec(“$/proj/Safe To Delete.txt”),VersionSpec.Latest,
    DeletedState.Any, ItemType.File,”MyProperty”, 24);

Пример: Создание ветвления

Можно разрешить разветвление существующего файла в системе управления версиями с помощью следующего кода, который вызывает методы PendBranch и CheckIn.Построение этого примера на Add a File to Version Control пытаются и демонстрируют, как использовать объектную модель для создания и вернуть ветвление существующего файла.Можно изменить образец кода для создания файла и заменять некоторые строки кода в этом примере код в этом примере.После применения этих изменений, затем можно создать ветвление файла в системе управления версиями.

Чтобы использовать этот пример

  • Открыть консольное приложение C#, созданный в разделе Add a File to Version Control, а затем заменить внутренний попытка блок следующим кодом:
String branchedFilename = Path.Combine(Path.GetDirectoryName(newFilename),
    Path.GetFileNameWithoutExtension(newFilename)) + "-branch" + Path.GetExtension(newFilename);

workspace.PendBranch(newFilename, branchedFilename, VersionSpec.Latest, LockLevel.Checkin, true);

var pendingChanges = workspace.GetPendingChanges();
int changesetForBranch = workspace.CheckIn(pendingChanges, "Branched file");
Console.WriteLine("Branched {0} to {1} in changeset {2}", newFilename, branchedFilename, changesetForBranch);

Можно добавить спецификацию версии при создании ветвление, а не просто используя последнюю версию файла.Например, можно указать идентификатор набора изменений и имя пользователя при вызове PendBranch.Так как несколько классов, производных от VersionSpec можно использовать спецификацию версии как параметр, чтобы получить все файлы, которые соответствуют идентификатор набора изменений или которые имеют определенную дату или задает.Дополнительные сведения см. разделе ChangeSetVersionSpec, DateVersionSpec или LabelVersionSpec.

В следующем примере указывается идентификатор набора изменений для связывания с разрешено разветвлениеым файлом.После фиксации изменений, идентификатор набора изменений разрешается разветвлениеого файла будет соответствовать значению, заданному.

VersionSpec versionSpec = VersionSpec.ParseSingleSpec(changesetId, username);
String branchedFilename = Path.Combine(Path.GetDirectoryName(newFilename),
    Path.GetFileNameWithoutExtension(newFilename)) + "-branch" + Path.GetExtension(newFilename);
// Use the version spec in the method call.
workspace.PendBranch(newFilename, branchedFilename, versionSpec, LockLevel.Checkin, true);

Пример: Удаление папок

Можно удалять папки из управления версиями с помощью следующего кода, который вызывает методы PendDelete и CheckIn.Построение этого примера на Add a File to Version Control пытаются и демонстрируют, как использовать объектную модель для удаления папки и затем повторить то изменение.Можно изменить образец кода для создания файла и заменять некоторые строки кода в этом примере со следующим примером.После применения этих изменений, затем можно удалять папки из системы управления версиями.

Чтобы использовать этот пример

  • Открыть консольное приложение C#, созданный в разделе Add a File to Version Control, а затем заменить внутренний попытка блок в исходном примере следующим кодом:
try
{
    // Delete the items
    workspace.PendDelete(workspace.GetServerItemForLocalItem(newFolder), RecursionType.Full);
    var pendingDeletes = workspace.GetPendingChanges();

    if (pendingDeletes.Length > 0)
    {
        workspace.CheckIn(pendingDeletes, "Clean up!");
    }
}
catch (VersionControlException ex)
{
    Console.Error.WriteLine("Error deleting file: {0}", ex.Message);
    throw;
}

См. также

Основные понятия

Расширение Team Foundation

Другие ресурсы

Использование управления версиями