2015-09-04 2 views
2

я добавил следующую AfterBuild задачу к .vcxproj файла:MSBuild: Как обеспечить целевой AfterBuild всегда работает в C++ проект

<Target Name="AfterBuild"> <Message Text="Hi" Importance="high" /> </Target>

Это, кажется, работает только если код С ++ построен (или если я восстанавливание): 1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug Win32 ------ 1> stdafx.cpp 1> SomeClass.cpp 1> ConsoleApplication1.vcxproj -> 1> Hi D:\Projects\CppTest\Debug\ConsoleApplication1.lib ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

Она не работает, когда код с ++ является уточненным: ========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

Как я могу это сделать всегда бежать? Я использую Visual Studio 2015.

ответ

0

В свойствах проекта в Visual Studio есть параметр «Запустить событие после сборки:», и вам нужно установить его: «Всегда» для события после сборки работать всегда.

Я думаю, теперь он установлен на «В успешной сборке».

+0

Извините. Бит смешивания. Хотя я упоминал csproj в вопросе, и я действительно экспериментирую в csproj, мне это действительно нужно для проекта C++ (файл vcxproj). Поэтому, в то время как csproj PostbuildEvent предлагает настройку «Всегда», vcxproj этого не делает. Это означает, что настройка «Всегда» не работает для меня. Сожалею. Я отредактирую вопрос. –

+0

Также обратите внимание, что «Всегда» запускает событие post-build не влияет на обработку цели AfterBuild. – yoyo

0

Создайте свой проект с подробным протоколированием (/ v: подробный или/v: diag) и найдите цель, которая будет выполняться последней, но присутствует в обоих случаях (скажем, это созданная цель FinalCleanup), затем подключите ваш цель после сборки, как это, а не специальным именем

<Target Name="RunMyLastTarget" AfterTargets="FinalCleanup"> 
    <Message Text="Hi" Importance="high" /> 
</Target> 
4

линия

========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ========== 

означает, что Visual Studio не запускать MSBuild вообще.

Для инкрементных построений VS использует File Tracker для перехвата файловых операций, выполняемых компилятором и компоновщиком. Результаты могут быть найдены в ProjName .tlog. В последующих сборках VS проверяет даты файлов, перечисленных в файлах .read и .write, и решает, следует ли запускать MSBuild. Эта функция описана в Hashimi S., Bartholomew S. - Использование MSBuild, 2nd Edition - 2013, глава «File Tracker».

Некоторые из возможных решений:

  1. Использование FileTracker API в вашем инструменте пользовательские сборки.
  2. Вручную записывайте имена файлов, созданные вашим инструментом, в каком-либо файле .write (это решение прост, но не гарантируется работа в будущих версиях VS).
  3. Создайте свое решение MSBuild вместо VS.
  4. Создайте свое решение из bat-файла, который сначала вызывает devenv, а затем ваш инструмент.
0

Я, наконец, пошел с Custom Build Step. Чтобы гарантировать, что он всегда выполняется, я установил поле Outputs в какой-то фиктивный путь к файлу. Поскольку путь фиктивного файла никогда не присутствует, всегда запускается Custom Build Step. Это взломанно, но он выполняет свою работу.

0

Я получил вокруг этого вопроса, добавив следующие строки в моем .vcxproj файла:

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

кажется заставить IDE на самом деле запустить MSBuild.

Я тестировал его в Visual Studio 2015.Добавление тех же строк в импортированный файл .targets не помогло.

Смежные вопросы