【问题标题】:Writing ProcessParameters during build在构建期间编写 ProcessParameters
【发布时间】:2013-12-18 14:03:41
【问题描述】:

我的 TFS2012 自定义构建工作流有许多自定义参数,这些参数在我的构建定义中定义。我想将它们全部传递给在构建期间运行的 exe(我知道自定义活动的选项,但我不能使用它,因为我不想每次都更改控制器的二进制文件)。

我设法将buildDetail.ProcessParametersbuildDetail.buildDefinition.ProcessParameters 写入文件并将它们传递给我的exe,它会解析它们(可能使用WorkflowHelpers.DeserializeProcessParameters。但是,这意味着exe 需要合并两者@ 987654326@s,我想避免这种情况。

有什么方法可以从工作流中获取生成的 ProcessParameters?我可以打电话给WorkflowHelpers.GetProcessParameters(Activity),但我如何获得工作流的根活动?

【问题讨论】:

    标签: tfs build workflow-foundation-4


    【解决方案1】:

    按照here 的建议,我设法通过保留WorkflowInstanceProxy 来做到这一点:

    public class WriteProcessParameters : CodeActivity
    {
        protected override void Execute(CodeActivityContext context)
        {
            WorkflowInstanceProxy proxy = context.GetExtension<WorkflowInstanceInfo>().GetProxy();
            Activity root = proxy.WorkflowDefinition;
            Dictionary<string, ProcessParameter> processParams = WorkflowHelpers.GetProcessParameters(root);
            // Serialize processParams somehow...
        }
    
        protected override void CacheMetadata(CodeActivityMetadata metadata)
        {
            base.CacheMetadata(metadata);
            metadata.AddDefaultExtensionProvider<WorkflowInstanceInfo>(() => new WorkflowInstanceInfo());
        }
    
        private class WorkflowInstanceInfo : IWorkflowInstanceExtension
        {
            private WorkflowInstanceProxy m_proxy;
            public IEnumerable<object> GetAdditionalExtensions() { yield break; }
            public void SetInstance(WorkflowInstanceProxy instance) { this.m_proxy = instance; }
            public WorkflowInstanceProxy GetProxy() { return m_proxy; }
        }
    }
    

    这在我的玩具测试中有效,但在实际工作流程中无效(不知道为什么)。所以我最终读取了属性,如下所示:

    public InArgument<string> Filename { get; set; }
    
    protected override void Execute(CodeActivityContext context)
    {
        var propDescriptors = context.DataContext.GetProperties().Cast<PropertyDescriptor>();
        var props = new Dictionary<string, object>();
        foreach (var propDesc in propDescriptors.OrderBy(p => p.Name))
        {
            object value = propDesc.GetValue(context.DataContext);
            if (value == null)
            {
                var converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
                if (converter.CanConvertTo(propDesc.PropertyType))
                {
                    value = converter.ConvertTo(value, propDesc.PropertyType); // Known case: null string
                }
                else
                {
                    continue;  // Known case: RunTestParameters
                }
            }
            else
            {
                if (!value.GetType().IsVisible || !value.GetType().IsSerializable)
                {
                    continue;
                }
            }
    
            props.Add(propDesc.Name, value);
        }
    
        File.WriteAllText(Filename.Get(context), WorkflowHelpers.SerializeProcessParameters(props));
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2021-05-25
      • 2018-09-20
      • 2016-07-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多