msbuild - msbuild可以编译构建任务然后使用它们吗?

标签 msbuild msbuild-task

我有一个构建任务,我想将其包含到我的msbuild 脚本中。我希望 CI 在尝试使用它们之前首先编译构建任务,以便添加的任何新构建任务都可用,并且不必编译实际程序集并将其提交给 CI 机器。我尝试过类似的事情。

<Target Name="SetupEnv">
    <MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" />
      <UsingTask TaskName="Foo.BarTask" AssemblyFile="$(MSBuildProjectDirectory)\BuildTasks\FooBuildTasks\bin\Release\FooBuildTasks.dll"/>
    <BarTask Variable="Test" Value="I'm Alive" />
  </Target>

这会构建任务组装文件,但似乎UsingTask任务无法在目标中运行。

error MSB4036: The "UsingTask" task was not found. Check the following: 1.) The name of the task in the project file is the sa...

有什么好的解决办法吗?如果我在 Project 下运行 UsingTask,如果我事先预编译了任务程序集,它就可以正常工作。

使用的msbuild平台是3.5

最佳答案

您需要两步构建或使用内联任务。两步构建涉及将构建分为预构建构建任务的“Configure”目标和执行构建的“CoreBuild”目标。

使用下面的任一技术,您需要确保您的“Configure”目标不需要由它构建的任何自定义任务。

1) 使用“构建”目标来驱动两步构建:

 <Target Name="Configure">
   <MSBuild Projects="PathTo/CustomBuidTasks.csproj" Target="Build" />
 </Target>

 <Target Name="CoreBuild">
   <MSBuild Projects="@(ItemsToBuild)" Target="Build" />
 </Target>

 <Target Name="Build">
   <MSBuild Projects="$(MSBuildThisFile)" Target="Configure" />
   <MSBuild Projects="$(MSBuildThisFile)" Target="CoreBuild" />
 </Target>

2) 设置 CI 系统来为您执行两步构建,本质上是使用 CI 工作流程复制上述内容,首先使用“配置”目标执行 MSBuild,然后单独执行更传统的“构建”目标。

3) 另一种方法是在 MSBuild 中使用内联任务。通过将任务代码放入 MSBuild 文件中,引擎会在任务首次执行时为您编译它。

摘自MSBuild Trickery技巧 #6 和 #32

关于msbuild - msbuild可以编译构建任务然后使用它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413852/

相关文章:

c# - Visual Studio 2010 IDE 构建神秘失败,没有任何错误或警告

msbuild - 如何从控制台输出中隐藏我在MSBuild Exec任务中使用的命令?

MSBuild 更新 csproj 中的属性

由于错误 APPX0002 : Task 'GenerateAppxPackageRecipe' failed. 值不能为空,MSBuild 失败

tfs - TFSBuild.proj 中复制目标的问题

tfs - 使用 TFS 中的多个目标框架将项目构建为 NuGet 包

c# - Roslyn:如何在 Visual Studio 之外加载现有项目

azure - Windows azure项目替换ServiceConfiguration.Cloud.cscfg

visual-studio - 即使发布成功,发布配置文件中的构建目标也不会执行

msbuild - Svcutil.exe MSBuild 任务