2015-04-29 6 views
0

Я настраиваю плагин TFS ISubscriber, и я хочу иметь возможность решить, следует ли запускать на основе установленного имени шаблона процесса (DONE), TypeID и Version.Прочитайте версию шаблона процесса и TypeID в плагине ISubscriber для TFS

Код для чтения имени относительно проста:

var ics = context.GetService<ICommonStructureService>(); 

string ProjectName = string.Empty; 
string ProjectState = String.Empty; 
int templateId = 0; 
CommonStructureProjectProperty[] ProjectProperties = null; 

ics.GetProjectProperties(context, projectUri.ToString(), out ProjectName, out ProjectState, out ProjectProperties); 

// The Projectproperties contains a property called "Process Template", holding the name. 

Но я не могу найти способ, чтобы прочитать другие свойства ... Я порезал этот код смотреть на сборках с использованием TFS Отражатель, но он всегда возвращается Unknown:

private ArtifactSpec GetProcessTemplateVersionSpec(string projectUri) 
{ 

    var commonService = this.context.GetService<CommonStructureService>(); 
    Guid guid = commonService.GetProject(this.context, projectUri).ToProjectReference().Id; 
    return new ArtifactSpec(ArtifactKinds.ProcessTemplate, guid.ToByteArray(), 0); 
} 

public ProcessTemplateVersion GetCurrentProjectProcessVersion(Uri projectUri) 
{ 
    return this.GetProjectProcessVersion(projectUri.AbsoluteUri, ProcessTemplateVersionPropertyNames.CurrentVersion); 
} 


public ProcessTemplateVersion GetCreationProjectProcessVersion(Uri projectUri) 
{ 
    return this.GetProjectProcessVersion(projectUri.AbsoluteUri, ProcessTemplateVersionPropertyNames.CreationVersion); 
} 

private ProcessTemplateVersion GetProjectProcessVersion(string projectUri, string versionPropertyName) 
{ 
    ArtifactSpec processTemplateVersionSpec = GetProcessTemplateVersionSpec(projectUri); 
    ProcessTemplateVersion unknown = ProcessTemplateVersion.Unknown; 

    using (TeamFoundationDataReader reader = context.GetService<TeamFoundationPropertyService>().GetProperties(context, processTemplateVersionSpec, new string[] { versionPropertyName })) 
    { 
     foreach (ArtifactPropertyValue value2 in reader) 
     { 
      foreach (PropertyValue value3 in value2.PropertyValues) 
      { 
       return TeamFoundationSerializationUtility.Deserialize<ProcessTemplateVersion>(value3.Value as string); 
      } 
      return unknown; 
     } 
     return unknown; 
    } 
} 

еще хуже, я бы также хотел бы быть в состоянии сделать это из объектной модели клиента, но, кажется, еще сложнее.

ответ

1

После консультаций с группой продуктов Microsoft мне грустно сообщать, что это свойство в настоящее время поддерживается только Visual Studio Online и что значения даже не хранятся для экземпляров на месте.

Существует некоторая работа вокруг от Рене ван Оснабрюге, чтобы скопировать эти значения and place them in the "standard" project properties.

Поместите следующее в вашем Classification.xml каждого шаблона процесса:

<properties> 
    <property name="MSPROJ" value="Classification\FieldMapping.xml" isFile="true" /> 
    <property name="Process Template" value="Microsoft Visual Studio Scrum 2.2" /> 
    <property name="Create Version" value="Custom Text is allowed here" /> 
    <property name="Current Version" value="Custom Text is allowed here" /> 
</properties> 

И использовать этот код, чтобы прочитать его потом:

string uri = @"http://myServer:8080/tfs/defaultcollection"; 
string teamProjectName = "myTeamProject"; 

// Get the team project 
var tpc = new TfsTeamProjectCollection(new Uri(uri)); 
tpc.Authenticate(); 

var ics = tpc.GetService<ICommonStructureService>(); 
var teamProject = ics.GetProjectFromName(teamProjectName); 

// Read the properties 
string projectName = string.Empty; 
string projectState = string.Empty; 
int templateId = 0; 
ProjectProperty[] projectProperties = null; 

ics.GetProjectProperties(teamProject.Uri, out projectName, out projectState, out templateId, out projectProperties); 

// Return the properties 
string processtemplate = projectProperties.Where(p => (p.Name == "Process Template")).Select(p => p.Value).FirstOrDefault(); 
string currentVersion = projectProperties.Where(p => (p.Name == "Current version")).Select(p => p.Value).FirstOrDefault(); 
string createVersion = projectProperties.Where(p => (p.Name == "Create version")).Select(p => p.Value).FirstOrDefault(); 

//Update the properties 
projectProperties.Where(p => (p.Name == "Current version")).First().Value = "MS Scrum 2.2 - Custom 2.3"; 
ics.UpdateProjectProperties(teamProject.Uri, projectState, projectProperties);