VS2012 Событие после сборки не сжигается
У меня есть веб-проект, который запускает событие после сборки "В успешной сборке" для выполнения некоторых действий по очистке/миграции (команда script).
В VS2012 пост-сборка на успех ТОЛЬКО срабатывает при изменении кода. Если нет изменения кода, компилятор все равно сообщает "Успешная сборка", однако событие после сборки после успешного запуска не срабатывает.
В VS2010 событие post-build на успех срабатывает при каждой успешной сборке независимо от изменений кода. Это то, чего я ожидал бы. Компиляция прошла успешно, даже если никаких изменений не произошло, поэтому событие должно срабатывать.
Пример сборки 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 ==========
Я попытался использовать событие post-build "Always" в VS2012. Он запускает событие Always post-build только в случае изменения кода (идентичного On on). Моим единственным обходным решением было сделать Rebuild - болезненным, когда у меня есть десятки зависимых проектов! Или вручную запустите мой script - также раздражает! (И нет, это не мой script - этот script работает отлично, когда есть изменение кода, как иллюстрирует первый пример!)
Это либо намеренное изменение, либо ошибка.
Кто-нибудь еще испытал эту проблему после сборки в VS2012?
Ответы
Ответ 1
У меня была та же проблема, и я решил ее следующим образом:
- добавить в проект некоторый фиктивный пустой файл txt.
- свойство "Build Action": содержимое.
- свойство "Копировать в выходной каталог": всегда.
thats it, он будет выполнять шаг POST-BUILD всегда, даже если проект обновлен или не является проектом запуска.
![enter image description here]()
Ответ 2
У меня была аналогичная проблема, и это помогло мне:
Инструменты... Параметры... Проекты и решения... Сборка и запуск...
Снимите флажок "Только создавать проекты запуска и зависимости от Run"
Как предлагается здесь: Событие после сборки при запуске (F5) В Visual Studio?
Ответ 3
События после сборки могут работать неправильно, если свойство 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>
Ответ 4
Для меня мне нужен этот ответ, в котором говорится, что если вы вызываете пакетный файл, используйте:
CALL mybatch
CALL anothercommand
вместо прямого использования команды:
mybatch
anothercommand
только mybatch
вызывается, если CALL
не используется.