c# - 未执行 MSBuild 脚本中覆盖的 AfterBuild 目标

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

有什么建议吗?

最佳答案

您必须添加 <Import Project="MyCommon.proj" />Microsoft.*.targets 之后的每个项目中. 因为AfterBuildMicrosoft.*.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 中定义的目标正确处理。 .

例子

通用 Prop

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

通用目标

<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" />
...

关于c# - 未执行 MSBuild 脚本中覆盖的 AfterBuild 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972101/

相关文章:

c# - 如何动态生成文本框并收集用户输入的数据?

c# - 如何创建一个dll以在单独的项目中引用和使用?

.net - 用简短的语言解释为什么需要 IQueryable<T>

c# - 发送短信 C#.net

gradle - Gradle-如何从子项目中获取任务输出

c# - Migradoc 真实表格单元格填充

c# - 是否可以在一行中编写 ROT13?

javascript - 为什么我的 webpack bundle.js 和 vendor.bundle.js 这么大?

c# - 度数计算不准确

java - Android Studio 2.1.3 中构建错误