msbuild能否编译生成任务,然后使用它们?
我有一个生成任务,希望将其包含在msbuild脚本中。我希望CI在尝试使用它们之前先编译构建任务,这样添加的任何新构建任务都是可用的,并且实际的程序集不必编译并提交给CI机器。我试过这样的东西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
<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)。