我有一个构建任务,我想将其包含在我的 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
答案 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