Предварительная и последующая цель в Visual Studio не срабатывают

Я делаю следующее:

  • Я создал проект файла класса по умолчанию
  • Отредактирован файл csproj для включения Pre и Post BuildEvents
  • Раскомментируйте отмеченные по умолчанию объекты BeforeBuild и AfterBuild

Цели BeforeBuild и AfterBuild не называются в Visual Studio, но из командной строки msbuild, почему?

Я предпочел бы использовать цели msbuild, а не PostBuildEvent, как будто это дает мне больше мощности и гибкости, если он работает.

Приветствия,

адам

Я сократил некоторые из путей на выходе, поэтому, если они непоследовательны, поэтому


ClassLibrary1.csproj изменяет

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeBuild">
  <Message Text="### BeforeBuild ###" />
</Target>
<Target Name="AfterBuild">
  <Message Text="### AfterBuild ###" />
</Target>
<PropertyGroup>
  <PreBuildEvent>echo PRE_BUILD</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
 <PostBuildEvent>echo POST_BUILD</PostBuildEvent>
</PropertyGroup>

Мой вывод сборки из VS 2010

------ Rebuild All started: Project: ClassLibrary1, Configuration: Debug Any CPU ------
PRE_BUILD
ClassLibrary1 -> c:\ClassLibrary1\bin\Debug\ClassLibrary1.dll
POST_BUILD
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

и из командной строки

#>msbuild ClassLibrary1.sln
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.239]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 09/05/2012 13:27:42.
Project "c:.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
  Building solution configuration "Debug|Any CPU".
Project "c:.sln" (1) is building "c:\ClassLibrary1.csproj" (2) on node 1 (default targets).
    BeforeBuild:
      ### BeforeBuild ###
PreBuildEvent:
  echo PRE_BUILD
  PRE_BUILD
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:
  ClassLibrary1 -> c:\bin\Debug\ClassLibrary1.dll
PostBuildEvent:
  echo POST_BUILD
  POST_BUILD
AfterBuild:
  ### AfterBuild ###
Done Building Project "c:\ClassLibrary1.csproj" (default targets).

Done Building Project "c:.sln" (default targets).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.18

Ответы

Ответ 1

Ваши события сборки запускаются, вы просто не видите их в Visual Studio.

По умолчанию VS устанавливает многословность msbuild на minimal. Вы можете получить сообщение, изменив значение сообщения на high

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

Вы также можете изменить настройку подробностей в VS в разделе "Инструменты- > Параметры" в разделе "Проекты и решения" → "Сборка и запуск".

Ответ 2

Просто для других, когда они сталкиваются с подобной проблемой, но причина может быть иной. Если у вас есть импорт после цели, то также AfterBuild может не работать.

Убедитесь, что весь импорт, который у вас есть, должен быть до определения цели, определение цели должно быть в конце