msbuild能否编译生成任务,然后使用它们?

msbuild能否编译生成任务,然后使用它们?,msbuild,msbuild-task,Msbuild,Msbuild Task,我有一个生成任务,希望将其包含在msbuild脚本中。我希望CI在尝试使用它们之前先编译构建任务,这样添加的任何新构建任务都是可用的,并且实际的程序集不必编译并提交给CI机器。我试过这样的东西 <Target Name="SetupEnv"> <MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" /> <UsingTask TaskName="Foo.BarTask" A

我有一个生成任务,希望将其包含在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任务

错误MSB4036:未找到“UsingTask”任务。检查 项目文件中任务的名称是sa

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


使用的msbuild平台为3.5

明确设置
OutDir
属性:

    <MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" 
             Properties="Configuration=Release;OutDir=$(MSBuildProjectDirectory)\BuildTasks\FooBuildTasks\bin\Release\" />


另外,
元素必须在

之外声明。您需要两步构建或使用内联任务。两步构建包括将构建拆分为预构建构建任务的“配置”目标和执行构建的“核心构建”目标

使用下面的任何一种技术,您都需要确保您的“Confugure”目标不需要它生成的任何自定义任务

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文件中,引擎将在首次执行任务时为您编译它


摘自《技巧6》和《技巧32》

的内容,构建工作如期进行。唯一的问题是如何让msbuild脚本构建它自己将要使用的构建任务。两步方法似乎是最简单的方法,因为任务非常复杂,可能不适合内联。我将尽快启动。如果主项目文件不在运行MSBuild的文件夹中,则需要使用$(MSBuildThisFileDirectory)/$(MSBuildThisFile)。