Должен ли я использовать MsBuild процедурно или декларативно? - PullRequest
0 голосов
/ 22 января 2020

Я пишу 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.

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

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