Как мне вызвать мой скрипт перед всеми сборками только один раз в проекте с множественным таргетингом - PullRequest
0 голосов
/ 28 апреля 2018

Я хотел бы запустить сценарий powershell только один раз перед процессом сборки. По моему мнению, это должно быть легко сделано, просто вызывая скрипт до того, как PreBuildEvent будет в порядке. Ну, это работает для обычных проектов.

Однако для проектов с множественным таргетингом сценарий будет вызываться несколько раз перед каждой сборкой для всей инфраструктуры таргетинга.

Вот файл моего проекта, в котором я нацеливаюсь на 3 фреймворка:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net40;net45;netstandard1.4</TargetFrameworks>
    <AssemblyName>abc</AssemblyName>
    <Version>1.0.0</Version>
  </PropertyGroup>
  <ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="PowerShell -ExecutionPolicy Unrestricted -File script.ps1/>
  </Target>
</Project>

И когда я собирал проект, цель PreBuild вызывалась 3 раза.

Пока что я пробовал:

1) Сначала я догадался, что сборки идут последовательно, поэтому добавил к цели условие:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition=" '$(TargetFramework)' == 'net40' ">
    <Exec Command="PowerShell -ExecutionPolicy Unrestricted -File script.ps1/>
  </Target>

, который не работал. Оказалось, что многоцелевые сборки шли одновременно. Иногда сборка net40 происходит позже, поэтому мой сценарий не запускался до всех сборок.

2) А потом я попытался использовать переменные окружения для синхронизации, но это тоже не сработало. Казалось, что сборки не разделяют переменные среды.

3) Наконец, я обратился к другим целям MSBuild, чтобы заменить PreBuildEvent, но я не нашел подходящего.

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

1 Ответ

0 голосов
/ 28 апреля 2018

Вы можете зацепить вашу цель в многотаргетированную цель msbuild, которая будет вызывать специфичные для TargetFramework сборки следующим образом:

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netstandard1.4</TargetFrameworks>
  </PropertyGroup>

  <Target Name="OuterPreBuild" BeforeTargets="DispatchToInnerBuilds">
    <Message Importance="high" Text="Outer before build" />
  </Target>

</Project>

В этом случае BeforeTargets="Build" Condition="'$(IsCrossTargetingBuild)' == 'true'" не будет работать, так как цель с множественным таргетингом Build зависит от уже созданных «внутренних проектов».

...