2011-08-16 5 views
3

MSBuild 작업의 BuildInParallel 특성을 사용하여 빌드 프로젝트를 병렬로 실행하고 있습니다. 루트 프로젝트는 4 개의 하위 프로젝트를 구축하고 있습니다. 자식 프로젝트는 System.Diagnostics.Process를 사용하여 새 프로세스를 시작하는 사용자 지정 MSBuild 작업을 사용하고 있습니다. UseShellExecute가 false이면 어떤 이유로 spawn 된 프로세스가 제대로 실행되지 않습니다.MSBuild BuildInParallel, 실행에 실패한 사용자 지정 작업 생성 프로세스

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 작업입니다 .. 일어나는 모두가 Process.ExitCode 1도 예외는 - 이것은 왜 나는 아무 생각도 없어 난 오류가 무엇인지 알아낼 수 없습니다

<?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.proj) 루트의 MSBuild 프로젝트 파일입니다 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

그리고 여기 샘플 출력입니다 :

<?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:\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 명령 중 하나에서 출력을 얻을 볼 수 있듯이.

+0

체크 아웃 Windows 이벤트 로그 – sll

+0

어떤 이벤트 로그에도 아무것도 표시되지 않습니다 .. –

+0

(1)은 ** UseShellExecute = false ** 왼쪽 끝에 쉼표가 붙어 있습니다. (2) UseShellExecute가 false로 설정되면 RedirectStandardOutput을 true로 설정하여 동일하게 시도 할 수 있습니까? – Arun

답변

0

정확히 어떤 문제가 발생하는지 말할 기회가 없으므로 직접 조사하거나 오류에 대한 자세한 정보를 제공해야합니다.

, 그것을 실행하는 동안 매우 자세한 출력을 덤프 진단 상세 레벨을 지정 MSBuild을 실행하는 데 사용 해보세요 :

MsBuild.exe /v:diag 
+1

감사합니다. 슬레브, 도움을 주셔서 감사합니다. 나는 약 2 일 동안 자신을 조사하는 데 썼다. 그리고 나는 완전히 난처한 상태 다. 문제는 새 프로세스가 항상 실행되는 것처럼 보이지 않으며 오류 메시지 (ExitCode 1 만)가 생성되지 않는다는 것입니다./v : diag는 더 많은 정보를 출력하지만 여전히 오류 메시지 나 단서가 두렵습니다. –

+0

@Tom : 디버깅을 시도 했습니까? MSBuildProcessTask의 생성자에서 중단 점을 설정할 수 있으면 중단 점을 설정하고 VS 메뉴에서 디버그 -> 예외 -> 모든 예외 사용을 선택한 다음 실행을 계속합니다. F5 예외 당신은 그것을 볼 수 – sll

+0

나는 디버깅을 시도했습니다. 예외는 발생하지 않습니다. 프로세스는 간단히 끝나고 (SQLCMD에서 출력되지 않음) ExitCode 1로 끝납니다. Process.Start()를 호출하면 "후드"에서 무슨 일이 일어나는지 디버깅 할 수있는 방법이 있습니까? –

0

당신이 각 대상에 고유 한 이름 ('기본')를 제공하려고 했습니까?

프로젝트를 포함 할 때 msbuild가 포함 된 프로젝트의 대상을 현재 프로젝트로 확장한다고 생각합니다. 기존 대상과 같은 이름의 다른 대상을 추가하면 기존 타겟이 대체됩니다.

here과 같이/preprocess 스위치를 사용하여 확장 된 프로젝트의 모양을 볼 수 있습니다.

+1

당신의 제안에 감사드립니다, @Alex. 불행히도 다른 대상 이름을 사용하더라도 차이가 발생하지 않습니다. 문제는 여전히 발생합니다. [가져 오기 요소] (http://msdn.microsoft.com/en-us/library/92x05xfs.aspx)를 사용하고 있지 않습니다. [MSBuild 작업] (http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx)을 사용하여 하위 프로젝트를 작성합니다. MSBuild 작업에 설명하는 동작이 있다고 생각하지 않습니다. –

관련 문제