Кажется, что MSBuild каждый раз выполняет цель «BeforeBuild», как будто сам проект библиотеки не нуждается в сборке.
Что вы имеете в виду, что msbuild каждый раз выполняет цель, даже если сам проект библиотеки не нуждается в сборке? Насколько я знаю, BeforeBuild
является одной из необходимых целей в процессе сборки, поэтому, если вы создаете один проект, он всегда будет вызывать эту цель. Если проект библиотеки не нужно собирать, по какой причине вы вызываете msbuild для его сборки? Больше подробностей могло бы быть лучше :)
Я хотел бы настроить процесс сборки для запуска сценария PowerShell только в том случае, если библиотеке необходимо (повторно) собрать.
Есть ли способ сделать это?
Я пытался использовать цели «BeforeBuild» и «BeforeCompile». Но это, кажется, выполняется каждый раз.
BeforeBuild
и BeforeCompile
— предопределенные цели в системе msbuild. Вы можете перезаписать их, чтобы настроить шаги сборки, но вы не можете избежать их запуска в процессе сборки. Таким образом, они будут выполняться каждый раз, когда запускается сборка, это ожидаемое поведение по дизайну.
Согласно вашему описанию, вы можете перезаписать эти цели и запустить в них сценарий Power Shell. Вот почему на вашей машине всегда будет вызываться скрипт ps.
Вот обходной путь, если вы собираете проект с помощью msbuild.exe вместо VS IDE:
Предполагая, что вы перезаписали BeforeTarget
в файле проекта. Вы можете добавить условие к определить, следует ли запускать специальный BeforeTarget
(скрипт вызова ps) или оригинальный BeforeTarget
.
Определите свойство с именем RunPS
и добавьте условие в BeforeTarget, которое вы используете следующим образом:
<PropertyGroup>
<RunPS>false</RunPS>
</PropertyGroup>
<Target Name="BeforeBuild" Condition="$(RunPS)=='true'">
<!--Run the ps script here-->
</Target>
Затем вы можете контролировать, использовать ли BeforeTarget по умолчанию или пользовательский, установив значение RunPS
.
msbuild xx.csproj /p:RunPS=true
для запуска скрипта ps во время сборки, msbuild xx.csproj
для запуска оригинального BeforeTarget
И если вы создаете проект в VS IDE, вы можете создать новую конфигурацию (CustomDebug), скопированную из Debug или Release, и установить Condition="$(Configuration)=='CustomDebug'"
в качестве цели.
Обновление:
Обходной путь, который работает в VS и командной строке:
См. этот документ, в VS мы можем легко создавать новые конфигурации, копируя настройки из конфигураций отладки и выпуска.
1. На мой взгляд, для вашего проекта библиотеки у вас есть обычные конфигурации отладки и выпуска, вы можете следовать советам в документе для создания соответствующих пользовательских конфигураций. Скопируйте параметр из Debug и создайте новую конфигурацию с именем PSDebug, скопируйте параметр из Release и создайте новую конфигурацию с именем PSRelease.
2.Затем отредактируйте xx.csproj, добавьте условие в таком формате:
<Target Name="BeforeBuild" Condition="'$(Configuration)'=='PSDebug' OR '$(Configuration)'=='PSRelease'">
<!--Run the ps script here-->
<Message Text="showsth" Importance="high" />
</Target>
Затем в VS IDE, если вы строите с обычной конфигурацией Debug or Release
, она будет использовать цель по умолчанию BeforeBuild
. И только когда вы строите с пользовательским PSDebug or PSRelease
, он вызывает вашу пользовательскую цель BeforeBuild
. В VS вы можете легко переключаться между этими конфигурациями с помощью этого поля:
И для командной строки это тоже работает. Если вы используете такую команду, как msbuild xx.csproj /p:Configuration=Debug
, для этого используется предопределенная цель BeforeBuild, а если вы используете команду, подобную msbuild xx.csproj /p:Configuration=PSDebug
, она вызывает вашу пользовательскую цель и запускает сценарий PS.
person
LoLance
schedule
06.08.2019