InvokeProcess的TFS活动(无需等待)

时间:2012-01-28 01:39:27

标签: tfs tfs2010 tfsbuild

我看到很多帖子等待各种活动的返回值,但在这种情况下,我想开始一项活动然后不等。我只想在(非常)慢的网络上复制一个目录,所以我不想创建另一个活动或使用批处理脚本。有人做过吗?有干净的方式吗?我可以把一些东西拼凑在一起,但我试图尽可能保持这种香味。

3 个答案:

答案 0 :(得分:1)

我不认为您可以使用开箱即用的东西。

一种方法是组织一个“调用进程”,调用另一个进行实际复制的服务。因此,从Build内部开始,让被调用的实体(在TFS构建方面超出范围)执行实际活动。这确实存在某些缺陷,更重要的是,如果成功或失败,您将无法在构建日志中知道。

另一种选择是使用Parallel活动(它位于“控制流”下的工具箱中 - System.Activities.Statements.Parallel)。这不像你需要的那样(踢和忘记),它仍然可以让你在你的副本发生时做其他事情。

答案 1 :(得分:1)

以下是创建新流程的简单自定义活动:

[BuildActivity (HostEnvironmentOption.All)]
public sealed class InvokeProcessAsync : CodeActivity
{
    [RequiredArgument]
    public InArgument<string> FileName { get; set; }

    public InArgument<string> Arguments { get; set; }

    public InArgument<string> WorkingDirectory { get; set; }

    public InArgument<IDictionary<string, string>> EnvironmentVariables { get; set; }



    protected override void Execute (CodeActivityContext context)
    {
        context.DublicateOperationsLogsToBuildOutput ();

        var psi = new ProcessStartInfo
        {
            FileName = context.GetValue (this.FileName),
            Arguments = context.GetValue (this.Arguments),
            WorkingDirectory = context.GetValue (this.WorkingDirectory)
        };

        var env_vars = context.GetValue (this.EnvironmentVariables);
        if (env_vars != null)
        {
            foreach (var v in env_vars)
                psi.EnvironmentVariables.Add (v.Key, v.Value);
        }

        Process.Start (psi);
    }
}

答案 2 :(得分:-1)

您需要来自Build.Workflow程序集的

CopyDirectory活动。