TFS 2010 / Интеграция метрик кода, сбой автоматической сборки, метрики кода не запускаются - PullRequest
4 голосов
/ 07 января 2011

Я пытаюсь добавить автоматический триггер после сборки для запуска 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 * Ли * .csproj (172): задача «BuildStep» не была найденный. Проверьте следующее: 1.) название задачи в файле проекта совпадает с названием задачи учебный класс. 2.) Класс задачи является «общедоступным» и реализует Microsoft.Build.Framework.ITask интерфейс. 3.) Задание правильно объявлено в файл проекта или в файлах * .tasks расположенный в "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319" каталог.

и

C * Ли * .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 * Ли * .csproj (179): команда "" C: \ Tools \ NDepend \ NDepend.console.exe» "C: * Л * \ Sources \ Main \ MyProject.ndproj" / OutDir "C: * Л * \ Бинарного \ Debug \ NDepend" / InDirs "C: * Л * \ Бинарный \ 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: * Бла * .csproj (180): элемент под элементом не распознан.

Ответы [ 2 ]

1 голос
/ 11 января 2011

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

<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>
0 голосов
/ 07 января 2011

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

...