什么是msbuild任务以及何时以及为什么选择使用它们?

时间:2017-01-18 03:51:58

标签: msbuild msbuild-task

什么是msbuild任务以及您应该使用它们或不使用它们的情况?有哪些替代方案?它们提供了哪些优点或缺点?

1 个答案:

答案 0 :(得分:2)

任务实现Task class,因此可以从msbuild代码调用。通常这可以通过例如编写实现该类的一些C#代码并将其构建到一个dll中,该dll将传递给UsingTask元素以使其可用。还有一种更短的方法:使用Inline Tasks。这允许在msbuild文件中直接编写代码。

严格来说没有其他选择,因为一个Task具有上面给出的定义,并且在msbuild中只有一个具有这些属性的东西。还有一个Target虽然用于调用任务(并且具有一堆其他功能,如表达对其他目标的依赖性,在/ outputs中定义它,...)。因此,考虑到存在一些重叠,这是另一种选择,我认为这就是您所要求的:您可以通过在目标中连续调用多个任务(或让目标依赖于其他目标等)或通过编写拥有执行全部或部分操作的任务。

例如:假设您要列出目录并将所有.c文件复制到另一个目录,然后压缩目录。您可以编写一个目标,在其中列出文件(使用ItemGroup),然后调用Copy和Zip任务。或者您编写一个使用C#调用的自定义任务,如Directory.GetFiles / File.Copy / ZipFile.CreateDirectory,并让目标调用只是您的自定义任务。

自定义任务的优点:它们可以包含任意代码,因此您基本上可以执行您可以想象的任何。缺点:需要使用它们构建,维护和运送msbuild代码(作为dll或者作为源代码,在这种情况下,它们需要在使用之前动态构建)。

具有现有(内置)任务的目标的优点:构建系统中的大多数常见功能都可以通过久经考验的代码获得,其中包含大量文档和/或SO问题作为额外资源,不需要重新发明轮子,其他人知道代码已经存在,没有自定义代码的维护。缺点:并非每一项功能都可用,实现功能的组合任务数量可能过高或不切实际。

何时使用任务基本上由上面两段回答。我不可能告诉你在实践中你会写多少自定义任务,因为我不知道你的用例。查看我自己的所有msbuild代码(用于处理混合的C / C ++ / C#/ Python项目)我会说它有大约95%的内置任务和5%的自定义任务。其中5%来自其他人写的任务ike MSBuild Community TasksMSBuild Extension Pack