我使用MSBuild任务的BuildInParallel属性并行地运行构建项目。根项目正在建设四个儿童项目。子项目正在使用自定义的MSBuild任务,该任务使用System.Diagnostics.Process启动新的进程。出于某种原因,当UseShellExecute为false时,派生进程无法正常运行。我不知道这是为什么,我也弄不清是什么错误 - 所发生的一切是Process.ExitCode是1,也不例外..MSBuild BuildInParallel,运行失败的自定义任务产卵过程
这里的自定义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,其实我只是在建设两个子项目在这里,但仍然得到错误..):
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="MSBuildProcessTask" AssemblyFile="C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\bin\Debug\MSBuildProcessTask.dll" />
<Target Name="Default">
<ItemGroup>
<ProjectFiles Include="$(MSBuildProjectDirectory)\Test.1.proj" />
<ProjectFiles Include="$(MSBuildProjectDirectory)\Test.2.proj" />
<!--<ProjectFiles Include="$(MSBuildProjectDirectory)\Test.3.proj" />
<ProjectFiles Include="$(MSBuildProjectDirectory)\Test.4.proj" />-->
</ItemGroup>
<MSBuild BuildInParallel="true" Projects="@(ProjectFiles)" />
</Target>
</Project>
而这里的孩子项目文件的例子( Test.1.proj):
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="MSBuildProcessTask" AssemblyFile="C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\bin\Debug\MSBuildProcessTask.dll" />
<Target Name="Default">
<Message Text="Hello" />
<MSBuildProcessTask Executable="sqlcmd" Arguments="-S .\SQLEXPRESS -Q "SELECT @@VERSION"" />
</Target>
</Project>
我的命令行是: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 <X64> (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命令之一获取输出。
检查窗口事件日志 – sll
没有任何事件日志.. –
(1)不是行** UseShellExecute = false,**最后留下逗号逗号? (2)当UseShellExecute设置为false时,你可以尝试与RedirectStandardOutput设置为true一样吗? – Arun