Я пишу build.proj, который собирает мой продукт. Он состоит из ряда визуальных студийных решений. Мне сказали, что msbuild - это декларативный язык, но при его использовании декларативный теряет зависимости, которые решения имеют друг от друга.
Декларативный:
<Project DefaultTargets="Build">
<ItemDefinitionGroup>
<Configuration>$(Configuration)</Configuration>
<Platform>$(Platform)</Platform>
<NugetRestore>False</NugetRestore>
<ItemDefinitiionGroup>
<ItemGroup>
<Solution Include="MainProduct.sln">
<NugetRestore>True</NugetRestore>
</Solution>
<Solution Include="Library1.sln">
<NugetRestore>True</NugetRestore>
</Solution>
<Solution Include="Library2.sln">
<NugetRestore>True</NugetRestore>
</Solution>
<Solution Include="BaseLibrary.sln">
</Solution>
</ItemGroup>
<Target Name="Build" Outputs="$(Solution.Identity)">
<Exec Condition="'%(Solution.NugetRestore)'=='True'"
Command="$(NugetExe) restore %(Solution.Identity)"/>
<MsBuild Projects="%(Solution.Identity)"
Properties="Platform=%(Solution.Platform);Configuration=%(Solution.Configuration)"/>
</Target>
</Project>
Процедурный:
<Project DefaultTargets="Build">
<Target Name="Build"
DependsOnTargets="MainProduct">
</Target>
<Target Name="MainProduct"
DependsOnTargets="Library1;Library2">
<Exec Command="$(NugetExe) restore MainProduct.sln"/>
<MsBuild Projects="MainProduct.sln"
Properties="Platform=$(Platform);Configuration=$(Configuration)"/>
</Target>
<Target Name="Library1"
DependsOnTargets="BaseLibrary">
<Exec Command="$(NugetExe) restore Library1.sln"/>
<MsBuild Projects="Library1.sln"
Properties="Platform=$(Platform);Configuration=$(Configuration)"/>
</Target>
<Target Name="Library2"
DependsOnTargets="BaseLibrary">
<Exec Command="$(NugetExe) restore Library2.sln"/>
<MsBuild Projects="Library2.sln"
Properties="Platform=$(Platform);Configuration=$(Configuration)"/>
</Target>
<Target Name="BaseLibrary">
<Exec Command="$(NugetExe) restore BaseLibrary.sln"/>
<MsBuild Projects="BaseLibrary.sln"
Properties="Platform=$(Platform);Configuration=$(Configuration)"/>
</Target>
</Project>
С процедурной версией я могу запустить msbuild -t:Library2
и знать, что Library2.sln будет построен после его зависимостей, которые являются BaseLibrary.sln.
Но с декларативной версией я не вижу, как это возможно. Кроме того, если мне нужно добавить цель, которая запускается после построения конкретного решения (возможно, подписать выходные данные или что-то в этом роде), есть ли способ сделать это в декларативной версии? Какой правильный путь?