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

MSBuild:编写和调用自定义任务,但MSBuild认为我需要TaskFactory,msbuild,msbuild-task,Msbuild,Msbuild Task,我开始使用MSBuild来处理项目的各种目标,我发现它非常灵活。这也帮助我了解我们CI系统的可能性 我需要获取项目的当前SVN版本,为此我编写了一个调用SubWCRev并解析输出的自定义任务 我使用以下元素引用此内容: <UsingTask TaskName="xxx.Elements.Build.MSBuildTasks.SubWCRev" AssemblyFile="D:\dev\xxx_presentation\Build\xxx.Elements.Build.dll">

我开始使用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属性,该属性表示为可选。我还发现TaskFactory特别适用于内联任务,我对此不感兴趣

错误消息是:

使用Task的元素中所需的属性TaskFactory为空或缺失

我哪里做错了


顺便说一句,我发现它非常优秀,并且减少了可能成为相当复杂脚本的阻力。

当您以传统方式指定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\u presentation\Build\xxx.Elements.Build.dll中的任务,则不应指定ParameterGroup,MSBuild知道如何查找参数,声明中存在该属性意味着MSBuild应该尝试查找内联任务的其余部分。

当您以传统方式指定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\u presentation\Build\xxx.Elements.Build.dll中的任务,则不应指定参数组,MSBuild知道如何查找参数,并且声明中存在该参数意味着MSBuild应尝试查找内联任务的其余部分