Секвенирование сборки проекта / решения и выполнение файла 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
Все сделано.