MSBuild BuildInParallel, processus de génération de tâches personnalisé qui échoue

J’utilise l’atsortingbut BuildInParallel de la tâche MSBuild pour exécuter des projets de génération en parallèle. Le projet racine est la construction de quatre projets enfants. Les projets enfants utilisent une tâche MSBuild personnalisée qui démarre un nouveau processus à l’aide de System.Diagnostics.Process. Pour une raison quelconque, le processus généré ne fonctionne pas correctement lorsque UseShellExecute est false. Je ne sais pas du tout pourquoi et je ne peux pas comprendre quelle est l’erreur. Tout ce qui se passe, c’est le Process.ExitCode = 1, sans exception.

Voici la tâche personnalisée MSBuild:

using System; using Microsoft.Build.Utilities; using System.Diagnostics; public class MSBuildProcessTask : Task { public ssortingng Executable { get; set; } public ssortingng 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; } } 

Et voici le fichier de projet racine MSBuild (Test.proj, en fait, je ne construis que deux projets enfants ici, mais j’obtiens toujours l’erreur ..):

        <!-- -->     

Et voici un exemple des fichiers de projet enfant (Test.1.proj):

         

Ma ligne de commande est la suivante: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /m /nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj

Et voici un exemple de sortie:

 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> 

Comme vous pouvez le constater, nous n’obtenons la sortie que d’une des commandes SQLCMD.

Aucune chance de dire exactement ce qui cause un problème, vous devez le rechercher vous-même ou au moins fournir plus de détails concernant une erreur.

Essayez d’exécuter MSBuild spécifiant le niveau de verbosité du diagnostic, il affichera une sortie très détaillée lors de l’exécution:

 MsBuild.exe /v:diag 

Avez-vous essayé d’atsortingbuer à chaque cible un nom unique (pas “Par défaut”)?

Je pense que lorsque vous incluez un projet, msbuild étend les cibles du projet inclus dans le projet actuel. Lorsque vous ajoutez une autre cible portant le même nom qu’une cible existante, celle-ci est remplacée.

Vous pouvez voir à quoi ressemble votre projet développé en utilisant le commutateur / preprocess, comme décrit ici .