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