我刚刚在http://sedodream.com/2012/07/28/MSBuildHowToExecuteATargetAfterCoreCompilePart2.aspx上写了这个答案,但我已经在下面为您粘贴了解决方案。
几个月前,我写了一篇博文 MSBuild 如何在 CoreCompile 之后执行目标,其中我描述了如果执行 CoreCompile 目标,您如何执行目标,如果跳过 CoreCompile,那么您的其他目标也将如此。我在上一篇文章中概述的方法的缺点是它需要您编辑 .csproj/.vbproj/etc 文件本身。因此,如果您有构建多个项目的场景,那么您将不得不编辑所有项目文件。在这篇文章中,我将描述如何执行相同的自定义,而无需编辑项目文件本身。
在我们为这个特殊案例找到解决方案之前,让我描述一下 C# 和 VB 项目所具有的可扩展性挂钩。用于构建 C# 和 VB 项目的大部分逻辑都包含在 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets 的 MSBuild 目标文件中。如果您查看该文件,您会注意到顶部的导入如下所示。
<Import Project="$(CustomBeforeMicrosoftCommonTargets)" Condition="'$(CustomBeforeMicrosoftCommonTargets)' != '' and Exists('$(CustomBeforeMicrosoftCommonTargets)')"/>
如果属性不为空且文件存在,则此语句将导入文件(位于 CustomBeforeMicrosoftCommonTargets 的值处)。CustomBeforeMicrosoftCommonTargets 的默认值为 C:\Program Files (x86)\MSBuild\v4.0\Custom.Before.Microsoft.Common.targets。因此,如果您将 MSBuild 文件放在该位置,它将修改在该计算机上构建的每个 C#/VB 项目的构建过程。或者,如果您不想要(或由于 ACL 而不能),则可以将文件放到其他位置,然后通过覆盖 CustomBeforeMicrosoftCommonTargets 属性来指定其位置。这是我将在这里采取的方法。我创建了一个示例解决方案,其中包含两个项目 ProjA 和 ProjB。我还有一个构建脚本 build.proj,可以为此自动构建。下面是 build.proj 的全部内容。
构建项目
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FileToInject Condition=" '$(FileToInject)'=='' ">$(MSBuildThisFileDirectory)extend-corecompile.proj</FileToInject>
</PropertyGroup>
<ItemGroup>
<ProjectsToBuild Include="ProjA\ProjA.csproj"/>
<ProjectsToBuild Include="ProjB\ProjB.csproj"/>
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(ProjectsToBuild)"
Properties="CustomBeforeMicrosoftCommonTargets=$(FileToInject)" />
</Target>
<Target Name="Clean">
<MSBuild Projects="@(ProjectsToBuild)" Targets="Clean"/>
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build"/>
</Project>
在上面的构建目标中,我使用 MSBuild 任务来构建 ProjA 和 ProjB。如您所见,我正在传递指向extend-corecompile.proj 的属性CustomBeforeMicrosoftCommonTargets=$(FileToInject)。通过在构建 ProjA 和 ProjB 时传递此属性,它将自动为构建过程导入 extend-corecompile.proj 文件。您可以在下面看到 extend-corecompile.proj 的内容。
扩展-corecompile.proj
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetsTriggeredByCompilation>
$(TargetsTriggeredByCompilation);
MyCustomTarget
</TargetsTriggeredByCompilation>
</PropertyGroup>
<Target Name="MyCustomTarget">
<Message Text="MyCustomTarget called" Importance ="high"/>
</Target>
</Project>
此项目文件使用我之前的博客文章中概述的技术,仅在执行 CoreCompile 时执行 MyCustomTarget。
注意:您可以在https://github.com/sayedihashimi/sayed-samples/tree/master/ExtBuildMultiple获取此示例的最新版本。