MSBuild:编写并调用自定义任务,但MSBuild认为我需要一个TaskFactory

时间:2011-07-29 09:39:03

标签: msbuild msbuild-task

我正在进入MSBuild来处理项目的各种目标,我发现它非常灵活。 (它也帮助我理解CI系统的可能性)

我需要获取项目的当前SVN修订版本,为此我编写了一个调用SubWCRev并解析输出的自定义任务。

我使用元素引用它:

<UsingTask TaskName="xxx.Elements.Build.MSBuildTasks.SubWCRev" AssemblyFile="D:\dev\xxx_presentation\Build\xxx.Elements.Build.dll">
    <ParameterGroup>
        <LastCommittedRevision ParameterType="System.Int" Required="False" Output="True" />
        <MixedRevisionRangeMinimum ParameterType="System.Int" Required="False" Output="True" />
        <MixedRevisionRangeMaximum ParameterType="System.Int" Required="False" Output="True" />
        <HasLocalModifications ParameterType="System.Boolean" Required="False" Output="True" />
    </ParameterGroup>
</UsingTask>

然后我执行任务......

  <Target Name="Version" BeforeTargets="BuildDatabase">
        <xxx.Elements.Build.MSBuildTasks.SubWCRev WorkingCopyDir="$(ProjectDir)..">
            <Output TaskParameter="LastCommittedRevision" ItemName="LastCommittedRevision" />
            <Output TaskParameter="MixedRevisionRangeMinimum" ItemName="MixedRevisionRangeMinimum" />
            <Output TaskParameter="MixedRevisionRangeMaximum" ItemName="MixedRevisionRangeMaximum" />
            <Output TaskParameter="HasLocalModifications" ItemName="HasLocalModifications" />
        </xxx.Elements.Build.MSBuildTasks.SubWCRev>
        <Message Text="Revision is @(LastCommittedRevision)" />
    </Target>

我的问题是MSBuild坚持使用TaskFactory属性,this document说这是可选的。而且我也看到TaskFactory特别适用于内联任务,我对此并不感兴趣。

错误消息是:

必需属性“TaskFactory”在元素UsingTask中为空或缺少。

我哪里错了?

(顺便说一下,我发现MSBuild Sidekick 3非常出色并且减少了可能成为一个相当复杂的剧本的阻力。)

1 个答案:

答案 0 :(得分:5)

当您以传统方式指定UsingTask以指向程序集中的任务时,该属性是可选的:

<UsingTask 
   TaskName="MyCustomTask"
   AssemblyFile="$(PathToTasks)/MyCustomTasks.dll"
   />

指定内联任务时,该属性不再是可选的。然后使用:

<UsingTask
   TaskName="EnableAllPropertyFunctions"
   TaskFactory="CodeTaskFactory"
   AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
   <ParameterGroup>...
   <Task>...
</UsingTask>

你在做什么似乎混合了这两者。如果您正在使用构建的程序集“D:\ dev \ xxx_presentation \ Build \ xxx.Elements.Build.dll”中的任务,那么您不应该指定ParameterGroup,MSBuild知道如何发现参数,并且它在您的声明中出现意味着MSBuild应该尝试查找内联任务的其余部分。