2011-08-16 13 views
3

MSBuildタスクのBuildInParallel属性を使用して、ビルドプロジェクトを並行して実行しています。ルートプロジェクトは4つの子プロジェクトをビルドしています。子プロジェクトは、System.Diagnostics.Processを使用して新しいプロセスを開始するカスタムMSBuildタスクを使用しています。何らかの理由で、UseShellExecuteがfalseの場合、生成されたプロセスが正しく実行されません。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> 

そして、ここで(子プロジェクトファイルの例です:

そして、ここでは(..実際に私はここでしか2子プロジェクトを構築していますが、まだエラーを取得し、Test.proj)ルートのMSBuildプロジェクトファイルです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> 

私のコマンドラインは次のとおりです。あなたは私たちが唯一のSQLCMDコマンドのいずれかからの出力を得る見ることができるように

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> 

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /m /nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj

そしてここでは、サンプル出力です。

+0

Windowsのイベントログをチェックする – sll

+0

イベントログには何もありません。 –

+0

(1)は行ではありません** UseShellExecute = false、**最後にコンマをつけたまま残しましたか? (2)UseShellExecuteがfalseに設定されている場合、RedirectStandardOutputをtrueに設定して同じことを試すことができますか? – Arun

答えて

0

正確に何が問題を引き起こすかについては言及する機会はありません。あなた自身で調査するか、エラーに関する詳細を提供する必要があります。

診断冗長レベルを指定MSBuildを実行するために試してみて、それが実行しながら、非常に詳細な出力をダンプします:

MsBuild.exe /v:diag 
+1

ありがとう、私は助けていただきありがとうございます。私は自分自身を調査する約二日間を過ごしたし、私は完全に困惑しています。問題は、新しいプロセスが常に実行されているとは限りませんし、エラーメッセージ(ExitCode 1のみ)が生成されないことです。/v:diagはより多くの情報を出力しますが、エラーメッセージや手がかりはまだ表示されません。 –

+0

@Tom:デバッグしようとしましたか? MSBuildProcessTaskのコンストラクタでブレークポイントを設定できれば、ブレークポイントを設定し、VSメニュー - >デバッグ - >例外 - >すべての例外を有効にしてから実行を続行します。F5例外があります。 – sll

+0

私はデバッグを試みました。例外はスローされません。プロセスは単純に終了し(SQLCMDからの出力なし)、ExitCode 1で終了します。Process.Start()を呼び出すと、何が起きているのかをデバッグできますか? –

0

あなたは、各ターゲットに一意の名前(ない「デフォルト」)を与えてみましたか?

プロジェクトを含めると、msbuildはインクルードされているプロジェクトのターゲットを現在のプロジェクトに展開すると思います。既存のターゲットと同じ名前の別のターゲットを追加すると、既存のターゲットが上書きされます。

hereの説明に従って、/ preprocessスイッチを使用して、拡張プロジェクトの外観を確認できます。

+1

あなたの提案に感謝、@アレックス。残念ながら、別のターゲット名を使用しても差は生じません。問題は引き続き発生します。私は[インポート要素](http://msdn.microsoft.com/en-us/library/92x05xfs.aspx)を使用していないことに注意してください。私は[MSBuildタスク](http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx)を使って子プロジェクトをビルドしています。私はMSBuildタスクがあなたが記述している振る舞いをしているとは思わない。 –

関連する問題