18

我正在执行以下操作:

  • 我创建了一个默认的类文件项目
  • 编辑 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
4

2 回答 2

54

您的构建事件正在触发,您只是在 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 中的 Tools->Options 下更改详细设置,然后在 Projects and Solutions->Build and Run 下更改。

于 2012-05-09T14:56:55.167 回答
8

只是为了其他人的帮助,当他们遇到类似的问题但原因可能不同时。如果您在目标之后进行了导入,那么 AfterBuild 也可能无法正常工作。

确保您拥有的所有导入都应该在目标定义之前,目标定义应该在最后

于 2016-10-31T19:05:22.973 回答