Если мой сценарий MSBuild использует пакетную обработку для «зацикливания» цели, выполняет ли его зависимости пакетную обработку? - PullRequest
1 голос
/ 16 февраля 2009

См. Этот пост MSDN для некоторого фона: Использование метаданных для вызова цели несколько раз с различными параметрами

Предложенное решение состояло в том, чтобы использовать метаданные в атрибуте вывода задачи для принудительного пакетирования задачи.

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

Я опробовал концепцию с помощью следующего скрипта:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="BuildSolutions"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="3.5">
    <ItemGroup>
        <BuildFile Include="myscript.txt">
          <InstallerFileName>MyInstaller1.msi</InstallerFileName>
          <CustomTwiddleBit>true</CustomTwiddleBit>
          <OtherCustomTwiddleBit>false</OtherCustomTwiddleBit>
        </BuildFile>
        <BuildFile Include="myscript.txt">
          <InstallerFileName>MyInstaller2.msi</InstallerFileName>
          <CustomTwiddleBit>false</CustomTwiddleBit>
          <OtherCustomTwiddleBit>true</OtherCustomTwiddleBit>
        </BuildFile>
    </ItemGroup>

    <Target  
        Name="BuildInstallers" 
        Outputs="OutputDir\%(BuildFile.InstallerFileName)" 
        DependsOnTargets="Step3" 
    >
        <Exec Command="echo %(BuildFile.InstallerFileName)" />
    </Target>

    <Target Name="Step1">  
        <Exec Command="echo step 1 %(BuildFile.InstallerFileName)" /> 
    </Target> 

    <Target Name="Step2" 
            DependsOnTargets="Step1">  
        <Exec Command="echo step 2 %(BuildFile.InstallerFileName)" /> 
    </Target> 

    <Target Name="Step3" 
            DependsOnTargets="Step2">  
        <Exec Command="echo step 3 %(BuildFile.InstallerFileName)" /> 
    </Target>      
</Project>

Вывод был следующим:

Microsoft (R) Build Engine Version 3.5.30729.1  
[Microsoft .NET Framework, Version 2.0.50727.3053]  
Copyright (C) Microsoft Corporation 2007. All rights reserved.  

Build started 2/16/2009 20:41:14.  
Project "D:\Source\test\test.proj" on node 0 (BuildInstallers target(s)).  
  step 1 MyInstaller1.msi  
  step 1 MyInstaller2.msi  
Step2:  
  step 2 MyInstaller1.msi  
  step 2 MyInstaller2.msi  
Step3:  
  step 3 MyInstaller1.msi  
  step 3 MyInstaller2.msi  
BuildInstallers:  
  MyInstaller1.msi  
BuildInstallers:  
  MyInstaller2.msi  
Done Building Project "D:\Source\test\test.proj" (BuildInstallers target(s)).  


Build succeeded.  
    0 Warning(s)  
    0 Error(s)  

Time Elapsed 00:00:00.43 

Любые идеи о том, как я могу получить вывод, будет выглядеть так:

step 1 MyInstaller1.msi
step 2 MyInstaller1.msi
step 3 MyInstaller1.msi

step 1 MyInstaller2.msi
step 2 MyInstaller2.msi
step 3 MyInstaller2.msi

Ответы [ 2 ]

2 голосов
/ 16 февраля 2009

Я определенно вижу проблему здесь как

<Exec Command="echo step 1 %(BuildFile.InstallerFileName)" />

Будет повторяться снова и снова в выходных данных InstallerFileName. Я думаю, что вместо этого вы можете назвать пользовательскую цель, и эта цель проходит через каждый из ваших шагов. Вызовите эту цель из основного скрипта с помощью Задачи MSBuild, примерно так:

<MSBuild Projects="CustomTargets.proj" 
  Targets="BuildInstallers"
  Properties="BuildFile=%(BuildFile.InstallerFileName)" />

И в вашей цели BuildInstallers вы бы использовали

<Target ="BuildInstallers" DependsOnTargets="Step3" >
</Target>

<Target Name="Step1">  
    <Exec Command="echo step 1 $(BuildFile)" /> 
</Target> 

и т.д.

0 голосов
/ 27 февраля 2014

Когда вы определяете цели и зависимости, вы определяете дерево зависимостей. MSBuild может выполнять задачи в любом порядке, в котором сочтет нужным, в том числе параллельно (при использовании /m), если порядок не нарушает никаких зависимостей.

В вашем случае MSBuild сначала решил запустить step 1 MyInstaller1.msi + step 1 MyInstaller2.msi, а если вы добавите /m, они, вероятно, будут работать параллельно. Если они не могут работать параллельно, это, вероятно, является ограничением в вашем проекте - возможно, использование одних и тех же промежуточных файлов - и вам следует это исправить.

Если вы хотите, чтобы выходные данные были упорядочены таким образом по причинам производительности, которые вы не можете объяснить MSBuild, я думаю, вы можете использовать хак <MSBuild>, описанный выше.

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