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