MSBuild: написание и вызов пользовательской задачи, но MSBuild считает, что мне нужна TaskFactory - PullRequest
1 голос
/ 29 июля 2011

Я вхожу в 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 специально для Inline Tasks, которая меня не интересует.

Сообщение об ошибке:

Обязательный атрибут "TaskFactory" пуст илиотсутствует в элементе UsingTask.

Где я ошибаюсь?

(И, кстати, я считаю MSBuild Sidekick 3 отличным иуменьшение сопротивления того, что может стать довольно сложным сценарием.)

1 Ответ

5 голосов
/ 29 июля 2011

Этот атрибут является необязательным, когда вы задаете 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 должен пытаться найти оставшуюся часть встроенной задачи.

...