在MSBuild脚本中重写的AfterBuild目标未执行

时间:2012-12-20 12:20:00

标签: c# .net build msbuild

我有一个非常简单的MSBuild脚本,可以构建一堆.sln文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- Builds all *.sln files under this repository. -->
    <ItemGroup>
        <SolutionFiles Include="**/*.sln" />
    </ItemGroup>


    <Target Name="Build">
        <MSBuild Projects="@(SolutionFiles)" Targets="Rebuild" />
    </Target>   

    <Target Name="AfterBuild">
        <Message Text="After Build" />
    </Target>

    <Target Name="AfterRebuild">
        <Message Text="After Rebuild" />
    </Target>   

</Project>

AfterBuild / AfterRebuild目标应该做其他事情,我现在只是测试它们。

我希望在每个项目构建之后触发这些目标,但这些目标不会被触发。

我做错了吗?

编辑:由于每个项目都定义了自己的AfterBuild目标,我猜这种方式不会真正起作用。 我尝试将 AfterBuild AfterRebuild 目标放在他们自己的文件(custom.targets)中,然后使用/ p运行MSBuild:自定义事件微软事件目录 = custom.targets 。这也行不通。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

您必须在<Import Project="MyCommon.proj" />之后的每个项目中添加Microsoft.*.targets。 因为AfterBuild

中定义了Microsoft.*.targets

它实际上记录在每个项目文件中。

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and    uncomment it. -->
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>

导入您的自定义或常用目标:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MyBuildRoot)\Common.targets" />

您甚至可以覆盖OutputPathIntermediateOutputPath。 但它们必须在Microsoft.CSharp.targets之前导入。 否则,它们将无法由Microsoft.CSharp.targets中定义的目标正确处理。

实施例

Common.props

<PropertyGroup>
  <DocumentationFile></DocumentationFile> <!-- disables xml-doc generate -->
  <ProjectRootPath>$(MSBuildThisFileDirectory)</ProjectRootPath>
</PropertyGroup>

<PropertyGroup Condition="$(BuildInOnePlace)!=''">
  <BaseIntermediateOutputPath>$(ProjectRootPath)obj/<BaseIntermediateOutputPath>
  <BaseOutputPath>$(ProjectRootPath)bin/<BaseOutputPath>
</PropertyGroup>

<PropertyGroup Condition="$(BuildInOnePlace)==''">
  <BaseIntermediateOutputPath>obj/<BaseIntermediateOutputPath>
  <BaseOutputPath>bin/<BaseOutputPath>
</PropertyGroup>

<PropertyGroup>
  <OutputPath>$(BaseOutputPath)$(Configuration)/</OutputPath>
  <IntermediateOutputPath>$(BaseOutputPath)$(Configuration)/</IntermediateOutputPath>
</PropertyGroup>

Common.targets

<Target Name="AfterBuild">
  <Message Text="$(ProjectName): $(OutputPath)" />
</Target>

SubProject1 \ SubProject1.csproj

...
<Import Project="../Common.props" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="../Common.targets" />
...

SubProject2 \ SubProject2.csproj

...
<Import Project="../Common.props" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="../Common.targets" />
...