Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Before and AfterBuild Target in Visual Studio not firing

I am doing the following:

  • I have created a default class file project
  • Edited the csproj file to include Pre and Post BuildEvents
  • Uncomment the default commented out BeforeBuild and AfterBuild targets

The BeforeBuild and AfterBuild targets are not called form within Visual Studio but are from msbuild command line, why is that?

I would rather use msbuild targets rather than the PostBuildEvent as if gives me more power and flexibility, assuming it works.

Cheers,

adam

I shortened some of the paths in the output, so if they are inconsistent that is why


ClassLibrary1.csproj changes

<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>

my build output from VS 2010 is

------ 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 ==========

and from the command line

#>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
like image 850
Adam Straughan Avatar asked May 09 '12 12:05

Adam Straughan


2 Answers

Your build events are firing, you're just not seeing them in Visual Studio.

By default VS sets the msbuild verbosity to minimal. You can get your message to show by changing the message importance to high

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

You can also change the verbosity setting in VS under Tools->Options then under Projects and Solutions->Build and Run.

like image 188
heavyd Avatar answered Oct 13 '22 18:10

heavyd


Just for others help, when they encounter similar issue but the reason could be different. If you have import after the target then also AfterBuild may not work.

Make sure all the import you have should be before Target Definition, Target Definition should be at the end

like image 24
shyam_ Avatar answered Oct 13 '22 18:10

shyam_