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

How incorporate a MSBuild custom task into Visual Studio solution?

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

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

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

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

您将在这里陷入一片混乱,因为 Visual Studio 在首次使用时将进入 lock the custom task Assembly,从而导致 Visual Studio 中的任何进一步构建(即构建 >解决方案)失败。

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

我决定采用的方法是创建一个单独的解决方案,例如"Build Tools",包含自定义任务程序集(以及其他工具),并要求先构建它。我个人觉得签入此源的预构建二进制文件的想法非常令人不快。如果开发人员不想构建构建工具解决方案,他们会复制某些夜间构建的输出。

不幸的是,没有一种简单的方法可以绕过 "hardcoding" 已知(相对)位置。使用 $(SolutionDir) 通常有效 - 如果您尝试直接在项目上 运行 MSBuild 而不是解决方案(当您自己打开项目时 VS 更智能一些)。