Но я ставлю в очередь автоматическую сборку, которую я настроил в 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): элемент под элементом не распознан.