我正在进入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非常出色并且减少了可能成为一个相当复杂的剧本的阻力。)
答案 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应该尝试查找内联任务的其余部分。