Секвенирование сборки проекта / решения и выполнение файла cmd в пользовательском файле MSBuild

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

Мой первый проход на этом ниже:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
      <Configuration>Release</Configuration>
      <Platform>AnyCPU</Platform>
   </PropertyGroup>
   <ItemGroup>
      <ProjectsToBuild Include="..\Hosts\solution1.sln"></ProjectsToBuild>
      <ProjectsToBuild Include="..\..\solution2.sln"></ProjectsToBuild>
      <ProjectsToBuild Include="helper1.csproj"></ProjectsToBuild>
      <ProjectsToBuild Include="..\..\Sandboxes\helper2.sln"></ProjectsToBuild>
      <Exec Include="" Command="CALL GetFiles.cmd"/>
      <ProjectsToBuild Include="wix\proc\prod.wixproj"></ProjectsToBuild>
      <Exec Command="CALL final.cmd"/>
   </ItemGroup>
   <Target Name="Build">
      <MSBuild Projects="@(ProjectsToBuild)" Targets="Build">
        <Output ItemName="ProjectOutputs" TaskParameter="TargetOutputs"/>
    </MSBuild>
    <Message Text="@ProjectOutputs"/>
   </Target>       
</Project>

Это привело к ошибке, так как элемент Exec находится не в том месте.

По сути, мне нужно собрать solution1.sln, solution2.sln,helper1.csproj и helper2.sln (по очереди), затем запустить файл GetFiles.cmd, затем собрать prod.wixproj, а затем запустить файл final.cmd.

Я посмотрел на MSDN ( здесь, здесь, здесь), блог, и просмотрел различные вопросы о стековом потоке (в том числе это, это, это, это), но ни один из них не совсем соответствует тому, что я пытаюсь сделать. Это первый раз, когда я работал с MSBuild, поэтому, возможно, я что-то пропустил. Буду признателен за любые указатели...

2 ответа

Решение

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

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Target1;Target2;Target3" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5" >
    <Target Name="Target1">
        <Message Text="Target 1" />
    </Target>
    <Target Name="Target2">
        <Message Text="Target 2" />
    </Target>
    <Target Name="Target3">
        <Message Text="Target 3" />
    </Target>
</Project>

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

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>AnyCPU</Platform>
  </PropertyGroup>
  <ItemGroup>
    <ProjectsToBuild Include="..\Hosts\solution1.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="..\..\solution2.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="helper1.csproj"></ProjectsToBuild>
    <ProjectsToBuild Include="..\..\Sandboxes\helper2.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="wix\proc\prod.wixproj"></ProjectsToBuild>

  </ItemGroup>
  <Target Name="Build">
    <Exec Command="CALL GetFiles.cmd"/>
    <Message Text="Build order: %(ProjectsToBuild.Identity)"/>

    <MSBuild Projects="@(ProjectsToBuild)" Targets="Build">
      <Output ItemName="ProjectOutputs" TaskParameter="TargetOutputs"/>
    </MSBuild>
     <Message Text="@(ProjectOutputs)"/>

    <<Exec Command="CALL final.cmd"/>
  </Target>
</Project>

В начале отображается порядок группы товаров:

Проект "C:\Test\Testcode\build\testcode.msbuild" на узле 1 (цели по умолчанию).

Телосложение:

Порядок сборки: ..\Hosts\solution1.sln

Порядок сборки: ....\solution2.sln

Порядок сборки: helper1.csproj

Порядок сборки:.... \ Песочницы \helper2.sln

Порядок сборки: wix\proc\prod.wixproj

Все сделано.

Другие вопросы по тегам