TFS 2010/ Интеграция метрик кода, сбой автоматизированных сборок, метрики кода не запускаются

Я пытаюсь добавить автоматический триггер после сборки для запуска NDepend (программного обеспечения для показателей кода) после автоматической сборки команды в TFS 2010.

Веб-сайт NDepend предоставил код для интеграции этой возможности, и поэтому я вставил их код в мой файл.csproj, куда они сказали, что он должен идти, но я получаю ошибки при сборке.

Ошибки относятся к двум из трех тегов "BuildStep", которые есть в фрагменте кода. Следующие два фрагмента дают мне ошибки:

<BuildStep         
    TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
    BuildUri="$(BuildUri)"
    Message="Running NDepend analysis">
  <Output TaskParameter="Id" PropertyName="StepId" />
</BuildStep>

а также

<BuildStep
   TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
   BuildUri="$(BuildUri)"
   Id="$(StepId)"
   Status="Failed" />

Однако этот фрагмент кода НЕ выдает никаких проблем:

<BuildStep
   TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
   BuildUri="$(BuildUri)"
   Id="$(StepId)"
   Status="Succeeded" />

Я просто не понимаю, почему все работает хорошо, а почти идентично выложенный тег BuildStep - нет. Есть что-то простое, что я просто пропускаю?

РЕДАКТИРОВАТЬ: Вот как это выглядит все вместе, если это имеет значение:

  <Target Name="NDepend"  >
    <PropertyGroup>
      <NDPath>c:\tools\NDepend\NDepend.console.exe</NDPath>
      <NDProject>$(SolutionDir)MyProject.ndproj</NDProject>
      <NDOut>$(TargetDir)NDepend</NDOut>
      <NDIn>$(TargetDir)</NDIn>
    </PropertyGroup>
    <Exec
      Command='"$(NDPath)" "$(NDProject)" /OutDir "$(NDOut)" /InDirs "$(NDIn)"'/>
  </Target>
  <Target Name="AfterBuild">
    <BuildStep         TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Message="Running NDepend analysis">
      <Output TaskParameter="Id" PropertyName="StepId" />
    </BuildStep>
    <PropertyGroup>
      <NDPath>c:\tools\NDepend\NDepend.console.exe</NDPath>
      <NDProject>$(SolutionRoot)\Main\src\MyProject.ndproj</NDProject>
      <NDOut>$(BinariesRoot)\NDepend</NDOut>
      <NDIn>$(BinariesRoot)\Release</NDIn>
    </PropertyGroup>
    <Exec
      Command='$(NDPath) "$(NDProject)" /OutDir "$(NDOut)" /InDirs "$(NDIn)"'/>
    <BuildStep
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Id="$(StepId)"
        Status="Succeeded" />
    <OnError ExecuteTargets="MarkBuildStepAsFailed" />
  </Target>

  <Target Name="MarkBuildStepAsFailed">
    <BuildStep
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Id="$(StepId)"
        Status="Failed" />
  </Target>

РЕДАКТИРОВАТЬ: добавил награду, потому что мне действительно нужно, чтобы это пошло для моей команды.

РЕДАКТИРОВАТЬ: Включая больше подробностей об ошибках, я замаскировал местоположение / имя файла "бла" по причинам авторского права, я не уверен, что могу технически раскрыть эту информацию, поэтому я ошибаюсь на стороне безопаснее, чем сожалею, но если вам абсолютно необходимо знать, чтобы решить эту проблему, я посмотрю, что я могу сделать. Следующие ошибки были перечислены в результатах неудачной сборки команды, а также в различных других предупреждениях, но я видел только эти ошибки, относящиеся к XML-коду NDepend выше.

Ошибки, которые я получаю, когда запускаю сборку команды:

C: * Blah *.csproj (172): Задача "BuildStep" не была найдена. Проверьте следующее: 1.) Имя задачи в файле проекта совпадает с именем класса задачи. 2.) Класс задачи является "общедоступным" и реализует интерфейс Microsoft.Build.Framework.ITask. 3.) Задача правильно объявлена ​​в файле проекта или в файлах *.tasks, расположенных в каталоге "c:\Windows\Microsoft.NET\Framework\v4.0.30319".

а также

C:*Blah*.csproj (194): Задача "BuildStep" не была найдена. Проверьте следующее: 1.) Имя задачи в файле проекта совпадает с именем класса задачи. 2.) Класс задачи является "общедоступным" и реализует интерфейс Microsoft.Build.Framework.ITask. 3.) Задача правильно объявлена ​​в файле проекта или в файлах *.tasks, расположенных в каталоге "c:\Windows\Microsoft.NET\Framework\v4.0.30319".

РЕДАКТИРОВАТЬ: Я думал, что у меня все работает правильно, но он по-прежнему не работает должным образом. Он по-прежнему выдает ошибки выше, когда я собираюсь, несмотря на то, что я имитирую предложенный @Ewald XML ниже. Я изменил значения свойств указанного кода в соответствии с тем, что, по моему мнению, должно работать следующим образом:

  <Target Name="NDepend"  >
    <PropertyGroup>
      <NDPath>c:\tools\NDepend\NDepend.console.exe</NDPath>
      <NDProject>$(SolutionDir)MyProject.ndproj</NDProject>
      <NDOut>$(TargetDir)NDepend</NDOut>
      <NDIn>$(TargetDir)</NDIn>
    </PropertyGroup>
    <Exec
      Command='"$(NDPath)" "$(NDProject)" /OutDir "$(NDOut)" /InDirs "$(NDIn)"'/>
  </Target>

  <Target Name="AfterBuild">
    <BuildStep         
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Name="CallMyTarget"
        Message="Call My Target"
        Condition="'$(IsDesktopBuild)'!='true'">
      <Output TaskParameter="Id" PropertyName="StepId" />
    </BuildStep>
    <CallTarget Targets="NDepend" ContinueOnError="false"/>
    <BuildStep
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Id="$(StepId)"
        Status="Succeeded"
        Condition="'$(IsDesktopBuild)'!='true'" />
    <OnError ExecuteTargets="FailStep" />
  </Target>

  <Target Name="FailStep">
    <BuildStep
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Id="$(StepId)"
        Status="Failed"
        Condition="'$(IsDesktopBuild)'!='true'" />
  </Target>

Тем не менее, я попытался просто вставить этот код:

  <Target Name="NDepend"  >
    <PropertyGroup>
      <NDPath>c:\tools\NDepend\NDepend.console.exe</NDPath>
      <NDProject>$(SolutionDir)MyProject.ndproj</NDProject>
      <NDOut>$(TargetDir)NDepend</NDOut>
      <NDIn>$(TargetDir)</NDIn>
    </PropertyGroup>
    <Exec
      Command='"$(NDPath)" "$(NDProject)" /OutDir "$(NDOut)" /InDirs "$(NDIn)"'/>
  </Target>

И автоматизированная сборка прошла нормально, без ошибок, но NDepend просто не работал так, как предполагалось.

Я начинаю задумываться (после консультации с различными другими подвопросами), есть ли небольшая разница в схеме XML, используемой в TFS2010, по сравнению с TFS2008, которая вызывает у меня эти проблемы. Итак, учитывая это, кто-нибудь знает о каких-либо больших различиях в этих схемах?

РЕДАКТИРОВАТЬ: Просто держать вас всех в курсе всего, что я пытался, теперь я попробовал этот код:

<Target Name="AfterBuild">
    <PropertyGroup>
      <NDPath>c:\tools\NDepend\NDepend.console.exe</NDPath>
      <NDProject>$(SolutionDir)MyProject.ndproj</NDProject>
      <NDOut>$(TargetDir)NDepend</NDOut>
      <NDIn>$(TargetDir)</NDIn>
    </PropertyGroup>
    <Exec
      Command='"$(NDPath)" "$(NDProject)" /OutDir "$(NDOut)" /InDirs "$(NDIn)"'/>
</Target>

и он выдал другое сообщение об ошибке, как показано ниже:

C: * Blah *.csproj (179): команда ""c:\tools\NDepend\NDepend.console.exe" "C:*Blah*\Sources\Main\MyProject.ndproj" /OutDir "C:*Blah*\Binaries\Debug\NDepend" /InDirs "C:*Blah*\Binaries\Debug\"" завершен с кодом 1.

РЕДАКТИРОВАТЬ: последний код, который я пробовал. Это было (согласно сайту NDepend) "встроенная задача NDepend MSBuild".

<Target Name="AfterBuild">
    <PropertyGroup>
        <NDPath>c:\tools\NDepend\NDepend.console.exe</NDPath>
        <NDProject>$(SolutionDir)MyProject.ndproj</NDProject>
      </PropertyGroup>
      <UsingTask AssemblyFile="$(NDPath)\MSBuild\NDepend.Build.MSBuild.dll"
             TaskName="NDependTask" />
      <Target Name="NDepend"  >
        <NDependTask NDependConsoleExePath="$(NDPath)"
           ProjectFilePath="$(NDProject)" />
      </Target>
</Target>

Но я получаю эту ошибку:

C: * Blah *.csproj (180): элемент под элементом не распознан.

2 ответа

Я использую следующие строки кода для выполнения дополнительных шагов сборки

<Target Name="Customization">
    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Name="CallMyTarget" Message="Call my target" Condition="'$(IsDesktopBuild)'!='true'" >
        <Output TaskParameter="Id" PropertyName="CurrentBuildStepId" />
    </BuildStep>

    <CallTarget Targets="MyTarget" ContinueOnError="false"/>

    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(CurrentBuildStepId)" Status="Succeeded" Condition="'$(IsDesktopBuild)'!='true'" />

    <OnError ExecuteTargets="FailStep"/>
</Target>

<Target Name="FailStep">
    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" Id="$(CurrentBuildStepId)" Status="Failed" Condition="'$(IsDesktopBuild)'!='true'" />
</Target>

Фрагменты кода работают только при запуске Team Build. Они, вероятно, потерпят неудачу, когда вы запустите сборку на рабочем столе. Вы можете безопасно удалить эти строки, потому что все, что они делают, это добавляют строку в журнал сборки, если вы используете Team Buid.

Другие вопросы по тегам