在为 .NET 项目扩展 MSBuild 编译而编写编译目标(Target)时,我们会遇到用于扩展编译目标用的属性 BeforeTargets
AfterTargets
和 DependsOnTargets
。
这三个应该分别在什么情况下用呢?本文将介绍其用法。
BeforeTargets
/ AfterTargets
BeforeTargets
和 AfterTargets
是用来扩展编译用的。
如果你希望在某个编译任务开始执行一定要执行你的编译目标,那么请使用 BeforeTargets
。例如我想多添加一个文件加入编译,那么写:
<Target Name="_WalterlvIncludeSourceFiles"
BeforeTargets="CoreCompile">
<ItemGroup>
<Compile Include="$(MSBuildThisFileFullPath)..\src\Foo.cs" />
</ItemGroup>
</Target>
这样,一个 Foo.cs 就会在编译时加入到被编译的文件列表中,里面的 Foo
类就可以被使用了。这也是 NuGet 源代码包的核心原理部分。关于 NuGet 源代码包的制作方法,可以扩展阅读:
- 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
- 从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
如果你希望一旦执行完某个编译任务之后执行某个操作,那么请使用 AfterTargets
。例如我想在编译完成生成了输出文件之后,将这些输出文件拷贝到另一个调试目录,那么写:
<Target Name="CopyOutputLibToFastDebug" AfterTargets="AfterBuild">
<ItemGroup>
<OutputFileToCopy Include="$(OutputPath)$(AssemblyName).dll"></OutputFileToCopy>
<OutputFileToCopy Include="$(OutputPath)$(AssemblyName).pdb"></OutputFileToCopy>
</ItemGroup>