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

What are msbuild tasks and when and why would you choose to use them?

什么是 msbuild 任务?您应该在什么情况下使用或不使用它们?有哪些选择?它们有什么优势或劣势?

一个任务实现了Task class and as such can be called from msbuild code. Usually this is done by e.g. writing some C# code implementing the class and building it into a dll which is passed to the UsingTask element to make it available. There's also a shorter way to do this: using Inline Tasks。这允许直接在 msbuild 文件中编写代码。

严格来说,没有其他选择,因为任务具有上面给出的定义,并且在 msbuild 中只有一个这样的东西具有完全相同的属性。还有一个 Target though 用于调用任务(并且具有许多其他功能,例如表达对其他目标的依赖性,将其定义为 in/outputs,...)。因此,考虑到存在一些重叠,这是另一种选择,我假设这就是您要问的:您可以通过在目标中连续调用多个任务(或使目标依赖于其他目标等)或通过编写您的执行所有或部分这些操作的自己的任务。

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

自定义任务的优点:它们可以包含任意代码,因此您基本上可以任何您可以想象的事情。缺点:需要构建、维护并与使用它们的 msbuild 代码一起发布(作为 dll 或作为源代码,在这种情况下,它们需要在使用前即时构建)。

具有现有 (built-in) 任务的目标的优点:在构建系统中发现的最常见功能在带有大量文档的经过试验和测试的代码中很容易获得 and/or SO 问题作为额外资源,无需重新发明轮子,其他人也已经知道该代码,无需维护自定义代码。缺点:并非每一个功能都可用,实现功能的组合任务数量可能太多或不切实际。

什么时候用tasks上面两段基本回答完了。我不可能告诉你在实践中你将编写多少自定义任务,因为我不知道你的用例。查看我自己的所有 msbuild 代码(用于处理 C/C++/C#/Python 项目的混合)我会说它大约有 95% built-in 任务和 5% 自定义任务。在这 5% 中,大部分来自其他人编写的任务,例如 MSBuild Community Tasks and MSBuild Extension Pack.