【问题标题】:Overridden AfterBuild target in MSBuild script is not executedMSBuild 脚本中覆盖的 AfterBuild 目标未执行
【发布时间】:2012-12-20 12:19:59
【问题描述】:

我有一个非常简单的 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 目标,我想这种方式不会真正起作用。 我尝试将 AfterBuildAfterRebuild 目标放在他们自己的文件 (custom.targets) 中,并使用 /p:CustomAfterMicrosoftCommonTargets=custom.targets 运行 MSBuild .这也不起作用。

有什么建议吗?

【问题讨论】:

    标签: c# .net build msbuild


    【解决方案1】:

    您必须在Microsoft.*.targets 之后的每个项目中添加一个&lt;Import Project="MyCommon.proj" /&gt;。 因为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" />
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多