TFS 2010 /代码度量标准集成,自动构建失败,代码度量标准不运行

时间:2011-01-06 22:06:33

标签: xml tfs build-automation team-build code-metrics

在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):元素    在元素下面   未被承认。

2 个答案:

答案 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,他们所做的只是在构建日志中添加一行。