【问题标题】:How incorporate a MSBuild custom task into Visual Studio solution?如何将 MSBuild 自定义任务合并到 Visual Studio 解决方案中?
【发布时间】:2015-07-18 10:25:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不要过度设计。将预构建的 MyCustomTask.dll 签入源代码管理,然后从您的项目中引用它,如下所示:<UsingTask TaskName="MyCustomTask" AssemblyFile="$(MySolutionRoot)\MyBuildTools\MyCustomTask.dll" />
  • 作为 S.T.说:将程序集放在“已知”位置并从那里引用它。如果您真的想要,您不必将预构建的任务 dll 放入源代码控制,但您可以使用 Csc 任务从源代码动态构建它。

标签: visual-studio msbuild


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2010-09-21
    • 2013-03-03
    • 1970-01-01
    • 2018-08-03
    • 2015-11-28
    • 2010-11-27
    相关资源
    最近更新 更多