在TFS 2010中自动化团队构建之后,我正在尝试添加自动构建后触发器以运行NDepend(代码度量软件)。
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>
编辑:增加了赏金,因为我真的需要为我的团队做好准备。
编辑:包含更多关于错误的细节,我出于版权原因用“blah”伪装了文件的位置/名称,我不确定我是否能够在技术上发布该信息,所以我我是在安全方面而不是抱歉,但如果你为了解决这个问题绝对必须知道,我会看到我能做些什么。失败的团队构建的结果以及各种其他警告中列出了以下错误,但这些错误是我能看到的唯一与上面的NDepend XML代码相关的错误。
运行团队构建时遇到的错误:
C:*布拉赫*的.csproj (172):“BuildStep”任务不是 找到。检查以下内容:1。) 项目文件中任务的名称 与任务名称相同 类。 2.)任务类是“公共的” 并实现 Microsoft.Build.Framework.ITask 接口。 3.)任务是正确的 在...中宣布 项目文件,或* .tasks文件 位于 “C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319” 。目录
和
C:*布拉赫*的.csproj (194):“BuildStep”任务不是 找到。检查以下内容:1。) 项目文件中任务的名称 与任务名称相同 类。 2.)任务类是“公共的” 并实现 Microsoft.Build.Framework.ITask 接口。 3.)任务是正确的 在...中宣布 项目文件,或* .tasks文件 位于 “C:\ WINDOWS \ Microsoft.NET \框架\ 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只是运行不像预期的那样。
我开始怀疑(在咨询了各种其他子问题之后)是否在TFS2010与TFS2008中使用的XML模式略有不同,导致我遇到这些问题。那么,考虑到这一点,有没有人知道这些模式中的任何重大差异?
编辑:只是让你了解我尝试过的所有内容,我现在尝试了这段代码:
<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:\工具\ NDepend的\ NDepend.console.exe” “C:* *胡说的\ Sources \ MAIN \ MyProject.ndproj” / OUTDIR “C:*布拉赫* \二进制\调试\ NDepend的” / InDirs “C:*布拉赫* \二进制\调试\”” 退出代码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):元素 在元素下面 未被承认。
答案 0 :(得分:1)
我使用以下代码行来实现其他构建步骤
<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>
答案 1 :(得分:0)
代码片段仅在运行Team Build时有效。运行桌面版本时,它们可能会失败。您可以安全地删除这些行,因为如果您使用Team Buid,他们所做的只是在构建日志中添加一行。