我读到了Brian Kretzler的书中使用这些机制,特别是Adam Badura发布的this example。
按照Badura的例子(他注意到“清理/重建确实会按预期删除文件。”)我有:
<PropertyGroup>
⋮
<CleanDependsOn>QtClean;$(CleanDependsOn)</CleanDependsOn> <!-- doesn't work -->
⋮
</PropertyGroup>
在顶层(文档根元素的直接子元素)。
当我使用IDE菜单清洁解决方案时,未执行QtClean目标。我不包含其中包含的Message任务,并且未观察到RemoveDir任务的预期效果(也没有任何错误消息)。
为什么这不起作用?
答案 0 :(得分:1)
这应该使用最新的VS2017功能增强Directory.Build.Targets来运行。 将以下内容插入到名称为 Directory.Build.Targets 的文件中,该文件位于存储库主干的根文件夹中。 MSBuild在加载.sln时,将自动加载自定义的Directory.Build.Targets文件。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Inject a custom target into Clean by extending CleanDependsOn -->
<PropertyGroup>
<CleanDependsOn> $(CleanDependsOn); CustomAfterClean </CleanDependsOn>
</PropertyGroup>
<Target Name="CustomAfterClean" Condition="$(ProjectName) == 'XXXMyProjectXXX'" >
<!--- my custom clean up -->
</Target>
</Project>
答案 1 :(得分:0)
我已经知道<CleanDependsOn>
不起作用,因为它被Microsoft.Common.Targets覆盖(不附加),它被拉入项目文件的底部。因此,它不能通过项目文件的内容中心或通常包含的属性表中的语句进行扩展。 “扩展目标”包含在项目文件的末尾,在正常的共同目标之后。
但是,<CppCleanDependsOn>
属性在任何地方都被扩展(不包括前一个值而不被覆盖)。
一般回答“为什么这不起作用?”是全局变量是邪恶的。您必须了解变量的时间接近度(“属性”),因为它可能在读取之前再次更改,或者在设置之前读取。