前言
MSBuild是一个强大的编译系统,强大到可能都不知道居然还有这些功能。我就简单的说一下——Target(目标),希望能帮助到大家!
不知道大家有没有遇到过这样一种常见,项目编译好了,但是这个项目还依赖一个数据文件,该数据文件可能需要打包或者加密等其他动作。也许大家会说生成前、后事件神马的也能支持,但是那个毕竟不方便模块化设计。
如果大家对模块化设计有比较高的要求,那么——Target或许会非常的适合你!
编写第一个Target
比如说,我们需要在生成完毕后将项目下的一个123.txt复制到输出目录。
那么我们可以在项目的配置中(vcxproj之类的)编写如下Target:
<Project>
<!--直接跳到xml文件最后...-->
<Target Name="Copy123_TXT" AfterTargets="Build;Rebuild">
<Copy SourceFiles="$(ProjectDir)123.txt" DestinationFolder="$(OutDir)" />
<!--在这之后可以填写其他任务,它们会按顺序执行。-->
</Target>
</Project>
其大概意思就是有个名字叫 Copy123_TXT 的 Target,再Build或者Rebuild后执行任务,任务是吧$(ProjectDir)123.txt 这个文件复制到 $(OutDir) 文件夹。
怎么样?还是挺简单的吧,更多MSBuild支持的任务可以参考官方文档。
编写第二个Target
之前我们在演示了一个简单的Copy文件任务,至于其他的复制文件夹,还是删除文件夹,还是执行其他什么exe命令行这些就不多阐述了。 相信大家都能从微软的官方文档中get到。
但是我们某些时候也仅仅是执行什么任务,我们也可能需要进行健壮性检测,不在预期范围的则给予罢工处理!
比如说,某项目必须在VS2019 以及Windows SDK 19041才能编译,否则就报错,让他准备好这些条件。
我们可以编写如下代码:
<Project>
<!--直接跳到xml文件最后...-->
<!--注意,这次我们用了 BeforeTargets,中文意思就是 在这些目标之前运行-->
<Target Name="My_Check" BeforeTargets="Build;Rebuild">
<Error Code="My404" Text="必须使用VS2019以及Windows SDK 19041!" Condition=" ('$(PlatformToolsetVersion)'!='142') Or ('$(WindowsTargetPlatformVersion)'!='10.0.19041.0')"/>
<!--在这之后可以填写其他任务,它们会按顺序执行。-->
</Target>
</Project>
我们主要使用了一个Error任务,并且给它加了一个Condition,Condition内部的用法也有很多,可以判断某文件是否存在,也可以读取注册表等等,具体可以参考MSBuild属性。
最后
Target初步的介绍就到这里啦,其实Target用法还是比较多的,甚至在Target还能写C#代码。我说这些话并不是为了吓退大家,只是希望大家并不要受限于此,发挥自己的想象力创造更多的可能!有好的点子也记得跟丫丫分享哦~~
顺道说下,YY-Thunks的Windows 2000支持就是用了Target来修改PE文件的最低支持版本。