Событие после сборки VS2012 не запускается

У меня есть веб-проект, который запускает событие после сборки «При успешной сборке» для выполнения некоторых действий по очистке / миграции (командный сценарий).

В VS2012 после успешной сборки запускается ТОЛЬКО при изменении кода. Если нет изменений кода, компилятор по-прежнему сообщает об успешной сборке, однако событие после успешной сборки не срабатывает.

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

Пример сборки VS2012 с изменением кода:

------ Build started: Project: ABC.Business.Web.Migrate, Configuration: Debug Any CPU ------
Build started 2012-08-23 01:26:13.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva- /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" /reference:C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" /debug+ /debug:full /optimize- /out:obj\Debug\ABC.Web.Migrate.dll /target:library /utf8output Properties\AssemblyInfo.cs "C:\Users\Administrator\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cs"
_CopyFilesMarkedCopyLocal:
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.dll" to "bin\ABC.Business.Web.dll".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Web.dll" to "bin\ABC.Web.dll".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC._Services.dll" to "bin\ABC._Services.dll".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.pdb" to "bin\ABC.Business.Web.pdb".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Web.pdb" to "bin\ABC.Web.pdb".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC._Services.pdb" to "bin\ABC._Services.pdb".
CopyFilesToOutputDirectory:
  Copying file from "obj\Debug\ABC.Web.Migrate.dll" to "bin\ABC.Web.Migrate.dll".
  ABC.Business.Web.Migrate -> C:\Dev\ABC\Source\ABC.Business.Web.Migrate\bin\ABC.Web.Migrate.dll
  Copying file from "obj\Debug\ABC.Web.Migrate.pdb" to "bin\ABC.Web.Migrate.pdb".
PostBuildEvent:
  "C:\Dev\bin\spawn.exe" "C:\Dev\ABC\Scripts\Migrate Business Web.bat"

Build succeeded.

Time Elapsed 00:00:00.34
========== Build: 4 succeeded, 0 failed, 53 up-to-date, 0 skipped ==========

Пример сборки VS2012 без изменения кода:

------ Build started: Project: ABC.Business.Web, Configuration: Debug Any CPU ------
Build started 2012-08-23 01:36:04.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  ABC.Business.Web -> C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.dll

Build succeeded.

Time Elapsed 00:00:00.31
========== Build: 1 succeeded, 0 failed, 56 up-to-date, 0 skipped ==========

Я пробовал использовать событие «Всегда» после сборки в VS2012. Он запускает событие Всегда после сборки только в случае изменения кода (идентично При успехе). Моим единственным обходным решением было выполнить Rebuild - болезненно, когда у меня есть десятки зависимых проектов! Или вручную запустить мой скрипт - тоже напрягает! (И НЕТ, это не мой сценарий - этот сценарий отлично работает при изменении кода, как показано в первом примере!)

Это либо преднамеренное изменение, либо ошибка.

Кто-нибудь еще сталкивался с этой проблемой после сборки в VS2012?


person Grant    schedule 23.08.2012    source источник
comment
Забыл упомянуть, что у меня два проекта. ABC.Business.Web и ABC.Business.Web.Migrate - Migrate имеет единственную ссылку на веб-проект. Событие после сборки содержится только в проекте Migrate (таким образом я могу скомпилировать без запуска скрипта). Таким образом, из вышеприведенного вывода видно, что проект ABC.Business.Web.Migrate вообще не компилируется !!   -  person Grant    schedule 23.08.2012


Ответы (4)


У меня была такая же проблема, и я решил ее следующим образом:

  • добавить в проект фиктивный пустой текстовый файл.
  • свойство "Build Action": Content.
  • свойство «Копировать в выходной каталог»: Всегда.

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

введите описание изображения здесь

person Jorge L. Fatta    schedule 11.01.2013
comment
Я не знаю, отвечает ли это на конкретный вопрос OP, но это решило мою проблему, спасибо! - person EJA; 06.05.2013
comment
Я не вижу этой опции для проектов на C ++. Хм - person Ben L; 05.11.2013
comment
Мне кажется, что это регресс Visual Studio. - person m.edmondson; 06.11.2013
comment
Вы полный герой! - person Asheh; 16.06.2015
comment
Имейте в виду, что это вызывает другое раздражение - теперь ваш проект будет всегда перестраиваться при запуске, даже если не было изменений кода. Если решение большое с множеством зависимостей, это может быть очень медленным и раздражающим. - person Nick; 09.12.2015
comment
Эти свойства отсутствуют в VS2017. - person kakyo; 07.08.2019
comment
Лучшее решение, которое я нашел, хотя постоянная сборка раздражает. В моем случае я хочу, чтобы пост-сборка продолжала работать и давать сбой (это проверка пользовательского кода), пока разработчик не исправит проблему. Чтобы решить мою проблему, в идеале VS будет хранить память об успехах / неудачах событий пост-сборки и продолжать их повторно запускать, пока они не вернут успех. Мне кажется, что нам нужно больше опций, доступных в области проекта до публикации. - person Jereme Guenther; 25.03.2021

У меня была аналогичная проблема, и это мне помогло:

Инструменты ... Параметры ... Проекты и решения ... Сборка и запуск ...

Снимите флажок «Создавать только запускаемые проекты и зависимости при запуске».

Как предлагается здесь: Событие после сборки при запуске (F5) В Visual Studio?

person lloyd christmas    schedule 19.10.2012

События после сборки могут работать некорректно, если свойство PostBuildEvent определено до импорта $(MSBuildToolsPath)\Microsoft.CSharp.targets. Убедитесь, что <PropertyGroup>, определяющий событие пост-сборки, находится после импорта этого файла.

Пример неверного файла msbuild:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Snip -->
  <!-- DO NOT USE, INCORRECT ORDERING OF IMPORT -->
  <PropertyGroup>
    <PostBuildEvent>echo $(TargetName)</PostBuildEvent>
  </PropertyGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Пример правильного файла msbuild:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Snip -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <PostBuildEvent>echo $(TargetName)</PostBuildEvent>
  </PropertyGroup>
</Project>
person Mitch    schedule 18.08.2016

Мне нужен был этот ответ, в котором говорится, что если вы вызываете командный файл, используйте:

CALL mybatch
CALL anothercommand

вместо прямого использования команды:

mybatch
anothercommand

будет вызываться только mybatch, если CALL не используется.

person noelicus    schedule 22.11.2016