Проблема с порядком сборки MSbuild - сначала выполняется предварительная сборка первых или зависимых проектов

У меня есть проект A в зависимости от проекта B. В проекте A есть некоторые задачи предварительной сборки, зависящие от некоторых сгенерированных файлов из проекта B. Когда я создаю Visual Studio, проблем нет. Но при использовании MSBuild.exe возникает проблема, потому что порядок сборки:

  • Шаги предварительной сборки < - не удалось, поскольку B не был скомпилирован
  • B скомпилирован < - ожидается, будет выполнен первым.
  • А скомпилирован

Это ожидаемое поведение с использованием MSBuild? Есть ли способ сообщить MSBuild сделать B сначала перед этапами предварительной сборки?

Я использую VS2010 С# и С++/CLI. Я не думаю, что если предлагает дополнительную информацию, но вот как она называется:

Running process (C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBUILD.exe "..\..\..\dev\build\MyProj.sln" /t:Clean /p:Configuration=Release;Platform=Win32)

Ответ 1

Короткий ответ

Удалите событие сборки и добавьте в проект что-то вроде следующего (.csproj):

<Target Name="AfterResolveReferences">
  <Exec Command="echo helloworld" />
</Target>

Дополнительная информация

Вы можете прочитать о настройке процесса сборки здесь: http://msdn.microsoft.com/en-us/library/ms366724%28v=vs.110%29.aspx

Событие Before Build запускается перед ResolveReferences, поэтому, если проект, с которым вы ссылаетесь, еще не был создан к моменту вашего события BeforeBuild проекта, ваше событие BeforeBuild завершится неудачно.

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

Ответ 2

Ответ на ответ, похоже, работает, но мне не понравилось, что поддержка редактирования .csproj не поддерживается в виртуальном интерфейсе VS, кроме неудобного проекта "Разгрузка проекта", "Редактировать проект" (во время которого вы не можете щелкнуть по вашим файлам, как вы обычно хотели), "Обновить проект". Я хотел, чтобы событие pre-build запускалось после создания зависимых проектов, и эта работа одинакова в VS, как в MSBuild. После борьбы с этой проблемой я нашел решение, которое работает для меня в MSBuild 4.0.

Независимо от того, что я пробовал, я не мог изменить цель PreBuildEvents для запуска после завершения строительства зависимых проектов. Так что я сделал вместо этого было отключить целевую программу PreBuildEvents и создать целевую целевую PreBuildEvents, которая будет запускаться в соответствующее время:

<ItemGroup>
  <ProjectReference Include="..\YourProjectPath\YourProject.csproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  </ProjectReference>
</ItemGroup>
<Target Name="PreBuildEvent" AfterTargets="" BeforeTargets="" />
<Target Name="BastardPreBuildEvent" AfterTargets="ResolveReferences" BeforeTargets="CoreResGen">
  <Exec Command="$(PreBuildEvent)" />
</Target>