我有一个非常简单的 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:CustomAfterMicrosoftCommonTargets=custom.targets 运行 MSBuild .这也没有用。
有什么建议吗?
最佳答案
您必须添加 <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" />
你甚至可以覆盖OutputPath
和 IntermediateOutputPath
.
但它们必须在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/