Visual Studio добавляет событие предварительной сборки, которое всегда запускается (проект С#)

В моем проекте я использую внешний инструмент для обновления некоторых двоичных файлов. Эти файлы включены в проект как "контент".

На данный момент инструмент настроен на запуск во время "события перед сборкой" в свойствах проекта С#. К сожалению, это событие выполняется только в том случае, если проект устарел, а это не то, что мне нужно.

Я работаю над этим, всегда используя "rebuild" вместо "build" в моем проекте, но это утомительно и медленно.

Мне нужно всегда запускать этот инструмент, независимо от того, является ли проект актуальным или нет. На самом деле, даже до того, как MSBuild даже определит, является ли проект актуальным, потому что инструмент изменяет некоторые файлы, включенные в проект, что влияет на результаты актуальных проверок.

Есть ли правильный способ сделать это?

Ответы

Ответ 1

Здесь решение. Определите это свойство в вашем файле проекта:

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup> 

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

Кажется, что Visual Studio обходит обычные современные проверки MSBuild и использует какую-то пользовательскую проверку, которая быстрее, но имеет побочный эффект от нарушения настроенных целей сборки.

Ответ 2

На уровне проекта у вас есть три варианта:

1) Действие предварительной сборки

<PropertyGroup>
  <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>

2) нормальная цель BeforeBuild

<Target Name="BeforeBuild">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

3) "прикреплен" к цели "Построить" (например, предложенный stijn)

<Target Name="BeforeBuild2" BeforeTargets="Build">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

На самом деле это решение (в случае сборки) не будет работать, потому что DependsOnTargets выполняется до BeforeTargets. И именно в DependsOnTargets сидит настоящий (CoreBuild):) Вот почему они изобрели цель "BeforeBuild";)


В обоих случаях VS проверяет, что-то изменилось (файлы обновлены). Почему вы хотите запустить внешнюю программу, если ничего не изменилось? Если эта программа работает с файлом (например, "content" ), msbuild и VS должны обнаруживать файлы как устаревшие и строить процессы.


К сожалению, у IDE (Visual Studio) есть собственный метод работы с проектами msbuild. Основной механизм тот же, но когда дело дошло, чтобы определить, какой проект построить или нет, или в каком порядке... VS действуют тотально разные.

Вы можете использовать внешний инструмент и запустить "msbuild" против своего решения или проекта. Это также скомпилирует "правильный путь", и двоичные файлы будут не разными, но у вас будут полные возможности и возможности MsBuild

Ответ 3

Ни одно из этих решений не работало для меня при использовании Visual Studio для Mac. Я хочу запустить bash-скрипт перед сборкой проекта, но так как я использую Xamarin, некоторые вещи выходят из строя. Я пробовал все различные типы целей и даже пробовал CustomCommands в настройках проекта, но все же у меня возникали проблемы, связанные с тем, что MSbuild работает автоматически или не работает до сборки

Вы можете запускать события PreBuild в отдельном проекте, который компилируется перед вашим основным проектом.

  1. Создайте новый проект и назовите его что-то вроде "PreBuildEvent"
  2. Добавьте ваши цели/команды MSbuild, как показано выше, в этот новый файл PreBuildEvent.csproj для каждой группы свойств/конфигурации сборки
  3. В проекте, в котором вы изначально выполняете работу PreBuild, добавьте ссылку на этот новый проект.
  4. Этот новый проект будет построен в первую очередь, выполняя любые события PreBuild, и как только этот проект будет построен, он начнет сборку для вашего исходного проекта. Это потому, что когда вы добавляете ссылку на проект, Visual Studio обязательно строит их в правильном порядке.

Ответ 4

Существует также еще одно событие предварительной сборки, которое здесь не обсуждалось. Обычно анализаторы кода используют это, чтобы проверить, был ли анализатор кода загружен NuGet.
Поэтому, если вы хотите выполнить что-то перед анализаторами кода, вам нужно использовать эту цель.

Вам просто нужно добавить узел <Target/> под узлом <Project/> в вашем файле .csproj:

<Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
    <Exec Command="notepad.exe Foo.txt"/>
</Target>