【问题标题】:How to gain access to various TFS build definition parameters如何访问各种 TFS 构建定义参数
【发布时间】:2014-11-11 16:57:04
【问题描述】:

我正在创建自定义 TFS 活动。似乎每个人都使用的默认模式是在 XAML 中创建一个变量,使用一些 TFS 活动对其进行设置,然后将其传递给您的自定义 TFS 活动。这看起来很原始,实际上很麻烦。如果您的 TFS 活动的接口发生更改,XAML 就会炸毁,丢失您为该活动开始所拥有的所有设置。

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

例如,我有一个基本的 TFS Activity 类,它当前执行以下操作...

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 中的一个参数)。

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

谢谢!

【问题讨论】:

    标签: tfs


    【解决方案1】:

    访问“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 编辑器的参数选项卡中列出的所有内容。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-06-14
        • 1970-01-01
        • 2016-10-11
        • 2016-01-29
        • 2016-06-03
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 2013-03-16
        相关资源
        最近更新 更多