Можно ли запретить MSBuild.exe запускать события сборки?
Автор вопроса: SniggerfardimungusОтветов: 9
Я создаю ряд проектов с помощью сценария, и случайное использование пользовательских событий сборки создает большие трудности для системы сборки. Если возможно, я бы хотел вызвать MSBuild.exe таким образом, чтобы блокировать выполнение любых событий сборки. В конечном счете, это не проблема для автоматизации сборки - отправители проектов с событиями сборки предупреждены о том, что такая фикция противоречит правилам.
Короче говоря, есть ли способ вызвать MSBuild, который предотвратит выполнение любых пользовательских шагов сборки, если они есть?
ОБНОВИТЬ:
Я бы подумал о том, чтобы выполнить (автоматическое) редактирование файлов проекта на месте, но предпочел бы, чтобы для параметра "Исключено из сборки" (см. Параметры "События сборки") для каждого из трех событий в командной строке было выбрано значение "Да".
Кажется, что ответ разный в зависимости от типа проекта.
Для проектов C / C ++ (.vcxproj) вы можете подавить PostBuildEvent в командной строке с помощью /p:PostBuildEventUseInBuild=false, как предлагает AndreiM.
(Установка /p:PostBuildEvent на пустую строку не работает для проектов C ++, и я не могу найти другого способа переопределить команду после сборки).
Для проектов C # (.csproj) вы можете подавить PostBuildEvent в командной строке с помощью /p:PostBuildEvent=, как предлагают большинство других респондентов.
Ответ 3 · рейтинг 15 · Sarin
Вы также можете сделать свойство условным
<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
Ответ 4 · рейтинг 10 · Sayed Ibrahim Hashimi
Что бы я сделал, так это определил бы новый файл .proj, скажем, C: \ Data \ SupressBuildEvents.proj, и он бы содержал:
Затем вам нужно указать, что эти файлы будут импортированы после Microsoft.Common.targets, и вы должны сделать это, определив хорошо известное свойство CustomAfterMicrosoftCommonTargets для пути к этому файлу. Итак, пусть ваш сценарий сборки находится в файле с именем MyBuild.proj, вы должны вызывать его как:
Это заставит MSBuild импортировать ваш файл после того, как файл Microsoft.Common.targets будет импортирован, и он переопределит цели PostBuildEvent и PreBuildEvent и заставит их ничего не делать.
Теперь, если ваши файлы MyBuild.proj используют задачу MSBuild для создания других целей то вы также должны передать им это свойство следующим образом:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectsToBuild Include=" FILL THIS IN "/>
</ItemGroup>
<Target Name="YourTarget">
<MSBuild Projects="@(ProjectsToBuild)"
Properties="CustomAfterMicrosoftCommonTargets=$(CustomAfterMicrosoftCommonTargets)"/>
</Target>
</Project>
Это необходимо, потому что по умолчанию свойства родительского сценария не передаются в сборки, выполняемые задачей MSBuild.
Ответ 5 · рейтинг 4 · derFunk
Вы также можете установить свойства в своей задаче MSBuild:
Я также немного поигрался с msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=, но для меня это не сработало, вероятно, потому, что я использую собственные файлы реквизита.
Однако я обнаружил, что работает /p:PostBuildEventUseInBuild=false
Ответ 7 · рейтинг 2 · AhmadYo
В некоторых проектах C # мне нужно, чтобы PostBuildEvent работал в сборке Visual Studio, но не работал в сборке MSBuild и TFS. Для этого добавляю PostBuildEvent в VS. Он устанавливает следующий код в .csproj:
<PropertyGroup>
<PostBuildEvent>*... my custom post build event ....*</PostBuildEvent>
</PropertyGroup>
Этот код устанавливает значение PostBuildEvent как пустое, и это происходит только в MSBuild и TFSBuild BeforeBuild target. Он простой, постоянный, не требует настройки параметров и отлично работает.
Добавление этого условия к цели для PreBuild в файле проекта csproj - единственное решение, которое сработало для меня. Я столкнулся с этой проблемой, пытаясь автоматизировать сборку в VSTS, где я хотел пропустить событие PreBuild, определенное в файле проекта csproj. Используя Visual Studio 2017, проект .NET Core 2.0.
Я попробовал перечисленные здесь предложения командной строки msbuild, но ни один из них не помог мне.
Ответ 9 · Brian
По умолчанию при импорте Microsoft.Common.targets вы получаете
чтобы отключить эти события до и после сборки. (Не уверен, нужно ли вам поместить это в свой файл .proj до или после импорта, или вам нужно изменить Microsoft.Common.targets, чтобы получить такой эффект. У меня нет времени экспериментировать прямо сейчас ...)