Проблема с порядком сборки 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>