如何将MSBuild自定义任务合并到Visual Studio解决方案中?

时间:2015-05-07 17:30:54

标签: visual-studio msbuild

我有一个项目,其中存在特定非标准文本格式的文件。当触摸/修改这些文件时,我想在它们上运行某个自定义编译器来生成XML,这是整个解决方案输出的一部分。

我正在考虑创建一个MSBuild任务来执行此操作。它将输入非stadard文件名并输出必需的XML文件。然后,该任务将用于解决方案中的其他项目。

我希望这个项目的新开发人员能够进行最少的设置。这意味着,我希望能够直接从源代码控制中获取我的解决方案的干净副本,并让构建首先构建自定义任务,然后根据需要将其应用于类中的其他项目。

我担心构建自定义任务的项目的构建输出需要将其输出程序集复制到某个已知位置,以便其他项目可以引用它。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你将要陷入混乱,因为Visual Studio在首次使用时会转到lock the custom task Assembly,从而导致Visual Studio中的任何进一步构建(即Build> Solution)失败。

正如@stijn所评论的那样,你应该覆盖Build目标并使用另一种用自定义任务构建程序集的方法,例如:使用Csc任务或生成另一个MSBuild.exe进程(请参阅链接问题的答案)。

我决定采用的方法是创建一个单独的解决方案,例如“构建工具”,包含自定义任务程序集(以及其他工具),并要求在其他任何工具之前构建它。我个人觉得这个来源的登记预建二进制文件的概念非常难吃。如果开发人员不想构建Build Tools解决方案,他们会复制一些每晚构建的输出。

不幸的是,没有一种简单的方法来解决“硬编码”已知(相对)位置的问题。使用$(SolutionDir)通常是有效的 - 如果你试图直接在项目上运行MSBuild而不是解决方案(当你自己打开一个项目时,VS会更聪明一些)。