4

TFS 2010で自動化されたチームビルドの後に、NDepend(コードメトリクスソフトウェア)を実行するための自動ビルド後トリガーを追加しようとしています。

NDependのWebサイトは、この機能を統合するためのコードを提供していたので、コードを.csprojファイルに貼り付けて、実行するように指示しましたが、ビルドでエラーが発生します。

エラーは、コードスニペットにある3つの「BuildStep」タグのうちの2つを参照しています。次の2つのスニペットでエラーが発生します。

<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>

編集:私は本当に私のチームのためにこれを実行する必要があるので、賞金を追加しました。

編集:エラーに関する詳細が含まれています。著作権上の理由から、ファイルの場所/名前を「何とか」と偽装しました。技術的にその情報を公開できるかどうかわからないため、申し訳ありませんが、この問題を解決するために絶対に知っておく必要がある場合は、私に何ができるかを見ていきます。失敗したチームビルドの結果やその他のさまざまな警告に次のエラーがリストされていましたが、上記のNDependXMLコードに関連するエラーはこれらのエラーだけでした。

チームビルドを実行したときに発生するエラー:

C:* Blah * .csproj(172):「BuildStep」タスクが見つかりませんでした。以下を確認してください。1。)プロジェクトファイル内のタスクの名前は、タスククラスの名前と同じです。2.)タスククラスは「パブリック」であり、Microsoft.Build.Framework.ITaskインターフェイスを実装します。3.)タスクは、プロジェクトファイル、または「c:\ Windows \ Microsoft.NET \ Framework\v4.0.30319」ディレクトリにある*.tasksファイルで正しく宣言されています。

C:* Blah * .csproj(194):「BuildStep」タスクが見つかりませんでした。以下を確認してください。1。)プロジェクトファイル内のタスクの名前は、タスククラスの名前と同じです。2.)タスククラスは「パブリック」であり、Microsoft.Build.Framework.ITaskインターフェイスを実装します。3.)タスクは、プロジェクトファイル、または「c:\ Windows \ Microsoft.NET \ Framework\v4.0.30319」ディレクトリにある*.tasksファイルで正しく宣言されています。

編集:私はそれが正しく実行されていると思ったが、それは正しく構築されていません。以下の@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:* 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のサイトによると)「組み込みのNDependMSBuildタスク」でした。

<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):要素の下の要素が認識されません。

4

2 に答える 2

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>
于 2011-01-11T04:29:01.917 に答える
0

コードスニペットは、チームビルドを実行する場合にのみ機能します。デスクトップビルドを実行すると、おそらく失敗します。Team Buidを使用している場合は、ビルドログに行を追加するだけなので、これらの行を安全に削除できます。

于 2011-01-07T00:30:27.637 に答える