MSBuild BuildInParallel,无法运行的自定义任务生成过程

我正在使用MSBuild任务的BuildInParallel属性来并行运行构建项目。 根项目正在构建四个子项目。 子项目正在使用自定义MSBuild任务,该任务使用System.Diagnostics.Process启动新进程。 由于某些原因,当UseShellExecute为false时,生成的进程无法正常运行。 我不知道为什么会这样,我无法弄清楚错误是什么 – 所有发生的事情都是Process.ExitCode是1,没有exception..

这是自定义MSBuild任务:

using System; using Microsoft.Build.Utilities; using System.Diagnostics; public class MSBuildProcessTask : Task { public string Executable { get; set; } public string Arguments { get; set; } public override bool Execute() { using (var p = new Process()) { try { p.StartInfo = new ProcessStartInfo(Executable, Arguments) { UseShellExecute = false, //RedirectStandardOutput = true }; //p.OutputDataReceived += (o, e) => //{ // if (e.Data != null) // { // Log.LogMessage(MessageImportance.Normal, e.Data); // } //}; p.Start(); //p.BeginOutputReadLine(); p.WaitForExit(); } catch (Exception e) { throw; // for setting breakpoint } finally { if (p.ExitCode != 0) { Log.LogError("Error. Exit code: " + p.ExitCode); } p.Close(); } } return true; } } 

这是根MSBuild项目文件(Test.proj,实际上我只在这里构建两个子项目,但仍然得到错误..):

        <!-- -->     

这是子项目文件(Test.1.proj)的示例:

         

我的命令行是: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /m /nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj

这是一个示例输出:

 C:\Users\Tom>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /m /nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildPr ocessTask\Test.proj Microsoft (R) Build Engine Version 4.0.30319.1 [Microsoft .NET Framework, Version 4.0.30319.235] Copyright (C) Microsoft Corporation 2007. All rights reserved. Build started 16/08/2011 22:22:06. 1>Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" on node 1 (default targets). 1>Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (1) is building "C:\Users\Tom\Sandbox\reposito ry_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.1.proj" (2) on node 1 (default targets). 2>Default: Hello 1>Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (1) is building "C:\Users\Tom\Sandbox\reposito ry_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj" (3) on node 2 (default targets). ------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------ Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) Mar 29 2009 10:11:52 Copyright (c) 1988-2008 Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1  (Build 7601: Service Pack 1) (1 rows affected) 3>Default: Hello 2>Done Building Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.1.proj" (default targets). 3>C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj(6,3): error : Error. Exit code: 1 3>Done Building Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj" (default targets). 1>Done Building Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (default targets). Build succeeded. "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (default target) (1) -> "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj" (default target) (3) -> (Default target) -> C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj(6,3): error : Error. Exit code: 1 0 Warning(s) 1 Error(s) Time Elapsed 00:00:00.23 C:\Users\Tom> 

如您所见,我们只从其中一个SQLCMD命令获得输出。

没有机会说出究竟是什么导致了问题,您必须自己进行调查或者至少提供有关错误的更多详细信息。

尝试运行MSBuild指定诊断详细级别,它会在运行时转储非常详细的输出:

 MsBuild.exe /v:diag 

您是否尝试为每个目标指定一个唯一的名称(而不是“默认”)?

我认为当你包含一个项目时,msbuild会将包含项目的目标扩展到当前项目中。 当您添加与现有目标同名的另一个目标时,将覆盖现有目标。

您可以使用此处所述的/ preprocess开关查看扩展项目的外观。