Но я ставлю в очередь автоматическую сборку, которую я настроил в TFS, и она не работает из-за ошибок, упомянутых выше. Разве это не сборка команды?

аюсь добавить автоматический триггер после сборки для запуска 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)

Ваш ответ на вопрос