我之前写过一篇 理解 C# 项目 csproj 文件格式的本质和编译流程,其中,Target
节点就是负责编译流程的最关键的节点。但因为篇幅限制,那篇文章不便详说。于是,我在本文说说 Target
节点。
Target 的节点结构
<Target>
内部几乎有着跟 <Project>
一样的节点结构,内部也可以放 PropertyGroup
和 ItemGroup
,不过还能放更加厉害的 Task
。按照惯例,我依然用思维导图将节点结构进行了总结:
▲ 上面有绿线和蓝线区分,仅仅是因为出现了交叉,怕出现理解歧义
<Hash>
和 <WriteCodeFragment>
都是 Task
。我们可以看到,Task
是多种多样的,它可以占用一个 xml 节点。而本例中,WriteCodeFragment
Task 就是生成代码文件,并且将生成的文件作为一项 Compile
的 Item 和 FileWrites
的 Item。在 理解 C# 项目 csproj 文件格式的本质和编译流程 中我们提到 ItemGroup
的节点,其作用由 Target
指定。所有 Compile
会在名为 CoreCompile
的 Target
中使用,而 FileWrites
在 Microsoft.NET.Sdk 的多处都生成了这样的节点,不过目前从我查看到的全部 Microsoft.NET.Sdk 中,发现内部并没有使用它。