MSBuild BuildInParallel, процесс создания пользовательских задач, который не запускается - PullRequest
3 голосов
/ 17 августа 2011

Я использую атрибут BuildInParallel задачи MSBuild для параллельного запуска проектов сборки. Корневой проект строит четыре дочерних проекта. Дочерние проекты используют пользовательскую задачу MSBuild, которая запускает новый процесс с использованием System.Diagnostics.Process. По какой-то причине порожденный процесс не может работать должным образом, когда UseShellExecute имеет значение false. Я понятия не имею, почему это так, и я не могу понять, что это за ошибка - все, что происходит, это Process.ExitCode = 1, без исключения ..

Вот пользовательская задача 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\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.

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Пытались ли вы дать каждой цели уникальное имя (не «По умолчанию»)?

Я думаю, что когда вы включаете проект, msbuild расширяет цели включенного проекта в текущий проект.Когда вы добавляете другую цель с тем же именем, что и существующая, существующая перезаписывается.

Вы можете увидеть, как выглядит ваш расширенный проект, используя параметр / preprocess, как описано здесь .

0 голосов
/ 17 августа 2011

Нет шанса сказать, что именно вызывает проблему, вы должны исследовать ее самостоятельно или, по крайней мере, предоставить более подробную информацию об ошибке.

Попробуйте запустить MSBuild с указанием уровня детализации диагностики, он выдаст дампочень подробный вывод во время выполнения:

MsBuild.exe /v:diag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...