如何访问各种TFS构建定义参数

时间:2014-10-21 20:26:41

标签: tfs tfs2013

我正在创建自定义TFS活动。似乎每个人使用的默认模式是在XAML中创建变量,使用某些TFS活动设置它,然后将其传递到您的自定义TFS活动中。这似乎非常原始,在实践中它非常麻烦。如果TFS活动的界面发生变化,那么XAML就会失去您开始活动的所有设置。

我认为传递给自定义活动的CodeActivityContext对象具有我需要的所有内容,但我不知道如何访问某些属性。

例如,我有一个基本TFS活动类,目前正在执行以下操作......

public abstract class ActivityBase : CodeActivity
{
    protected CodeActivityContext _context;
    protected IBuildAgent _buildAgent;
    protected IBuildDetail _buildDetail;
    protected IBuildDefinition _buildDefinition;
    protected string _buildDirectory;

    protected override void Execute(CodeActivityContext context)
    {
        _context = context;

        _buildAgent = context.GetExtension<IBuildAgent>();
        _buildDetail = context.GetExtension<IBuildDetail>();
        _buildDefinition = _buildDetail.BuildDefinition;
        _buildDirectory = _buildAgent.GetExpandedBuildDirectory(_buildDefinition);

        Execute();
    }

    protected abstract void Execute();
}

注意我可以访问BuildDefinition,并且我确信它是我的自定义XAML属性的网关,这些属性由用户设置。但是,我不知道如何访问它们?

另外,我想访问ProjectsToBuild设置(这是默认XAML中的参数)。

我还需要其他一些东西,但如果我能掌握这些第一件事,我应该能够弄清楚其余的事情。

谢谢!

2 个答案:

答案 0 :(得分:2)

访问“ProjectsToBuild”的代码

protected override void Execute(CodeActivityContext context)
{
    var props = context.DataContext.GetProperties();
    var bsProp = props["BuildSettings"];
    var buildSettings = (BuildSettings) bsProp.GetValue(context.DataContext);

    if (buildSettings.HasProjectsToBuild)
    {
        context.TrackBuildMessage("Projects to build:", BuildMessageImportance.High);
        foreach (var project in buildSettings.ProjectsToBuild)
        {
            context.TrackBuildMessage(project, BuildMessageImportance.High);
        }
    }
    else
    {
        context.TrackBuildMessage("No 'Projects to build' in build definition", BuildMessageImportance.High);
    }
}

这样您就可以访问(只读)构建模板的XAML编辑器的Arguments选项卡中列出的所有内容。

var props = context.DataContext.GetProperties();
foreach (System.ComponentModel.PropertyDescriptor prop in props)
{
    context.TrackBuildMessage(string.Format("{0}: {1}", prop.Name,  prop.GetValue(context.DataContext)), BuildMessageImportance.High);    
}

也可以从IBuildDefinition访问“ProjectsToBuild”(您尝试这样做),但是除了构建扩展之外的其他地方也很有用:

new List<string>() projectsToBuild = new List<string>();

IDictionary<string, object> deserializedProcessParameters = WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters);

if (deserializedProcessParameters.ContainsKey("BuildSettings"))
{
    BuildSettings buildSettings = (BuildSettings)deserializedProcessParameters["BuildSettings"];

    if (null != buildSettings) 
        projectsToBuild = buildSettings.ProjectsToBuild;

}

答案 1 :(得分:-1)

访问自定义或任何构建工作流属性的唯一方法是将它们传入。它们不能以任何其他方式从CodeActivity中获取。这是Windows Workflow的功能与否。