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

时间:2012-02-23 13:17:41

标签: 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 任务。

  

错误MSB4036:找不到“UsingTask”任务。检查   以下:1。)项目文件中任务的名称是sa ...

这周围有什么好的解决方案吗?如果我在项目下运行 UsingTask ,如果我事先预先编译了任务程序集,那么它可以正常工作。

使用的msbuild平台为3.5

2 个答案:

答案 0 :(得分:3)

明确设置OutDir属性:

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

此外,<UsingTask>元素必须在<Target>

之外声明

答案 1 :(得分:2)

您需要两步构建或使用内联任务。两步构建涉及将构建拆分为预先构建构建任务的“配置”目标,以及执行构建的“CoreBuild”目标。

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

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

 <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工作流复制上述内容,首先使用“Configure”目标执行MSBuild,然后单独执行更传统的“Build”目标。

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

摘自MSBuild Trickery技巧#6和#32