gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:41:13 25 4
gpt4 key购买 nike

我正在使用 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,实际上我在这里只构建了两个子项目但仍然出现错误..):

<?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 &quot;SELECT @@VERSION&quot;" />
</Target>
</Project>

我的命令行是:C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe/m/nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\测试.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 命令获得输出。

最佳答案

没有机会说出问题的确切原因,您必须自己调查或至少提供有关错误的更多详细信息。

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

MsBuild.exe /v:diag

关于c# - MSBuild BuildInParallel,无法运行的自定义任务生成过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7085185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com