Я хотел бы запустить сценарий 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, но я не нашел подходящего.
Итак, как мне вызывать мои сценарии перед всеми сборками и только один раз в проекте с несколькими целями? Пожалуйста, помогите мне.