web-dev-qa-db-ja.com

ASP.NET MVC 1.0AfterBuildingビューがTFSビルドで失敗する

ASP.NET MVCベータ版から1.0にアップグレードし、MVCプロジェクトに次の変更を加えました(RCリリースノートに記載されています)。

<Project ...>
  ...
  <MvcBuildViews>true</MvcBuildViews>
  ...
  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
  </Target>
  ...
</Project>

ビルドはローカル開発ボックスで正常に実行されますが、TFS2008ビルドでは「タイプ 'xxx.MvcApplication'を読み込めませんでした」で失敗します。以下のビルドログを参照してください。

...
using "AspNetCompiler" task from Assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "AspNetCompiler"

  Command:
  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v temp -p D:\Builds\xxx\Continuous\TeamBuild\Sources\UI\xxx.UI.Dashboard\\..\xxx.UI.Dashboard 
  The "AspNetCompiler" task is using "aspnet_compiler.exe" from "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe".
  Utility to precompile an ASP.NET application
  Copyright (C) Microsoft Corporation. All rights reserved.

/temp/global.asax(1): error ASPPARSE: Could not load type 'xxx.UI.Dashboard.MvcApplication'.
  The command exited with code 1.

Done executing task "AspNetCompiler" -- FAILED.
...

MVC 1.0はTFSにインストールされ、同じTFSサーバー上のVisualStudioインスタンス内にビルドされたときにソリューションがコンパイルされます。

このTFSビルドの問題を解決するにはどうすればよいですか?

62
o_o

この問題は、ASP.NETMVCプロジェクトのAfterBuildターゲット内で使用されるAspNetCompilerMSBuildタスクが、Webプロジェクトのbinフォルダー内のdllを参照することを想定しているという事実に起因します。

デスクトップビルドでは、binフォルダーはソースツリーの下にあると予想される場所です。

ただし、TFS Teambuildは、ソースの出力をビルドサーバー上の別のディレクトリにコンパイルします。 AspNetCompilerタスクが開始すると、必要なDLLを参照するbinディレクトリが見つからず、例外が発生します。

解決策は、MVCプロジェクトのAfterBuildターゲットを次のように変更することです。

  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler Condition="'$(IsDesktopBuild)' != 'false'" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
    <AspNetCompiler Condition="'$(IsDesktopBuild)' == 'false'" VirtualPath="temp" PhysicalPath="$(PublishDir)\_PublishedWebsites\$(ProjectName)" />
  </Target>

この変更により、デスクトップとTFSビルドサーバーの両方でビューをコンパイルできるようになります。

17
crowleym

実際、この問題にはもっと良い解決策があります。 VS/TFS 2010でテストしましたが、VS/TFS2008でも動作するはずです。

<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

MVCチームと協力して、プロジェクトテンプレートを更新し、(AfterBuildをオーバーライドするのではなく)カスタムターゲットとともにこのアプローチを使用するようにします。

How to TFS Build2010でASP.NETMVCプロジェクトのコンパイル時ビューチェックをオンにする に関するブログ投稿を公開しました。

180
Jim Lamb

私がWeb.csprojを作成したとき、JimLambのソリューションは機能しませんでした

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

ターゲットが実行されていてAfterBuildであり、アプリケーションがまだWebProjectOutputDirにコピーされていないためです。 (ところで、これらのプロパティをWebプロジェクトビルドcosに渡します。ビルドで、バイナリと圧縮に適したcshtmlファイルのみを含むOutDirフォルダーを作成します。つまり、インプレースビルドではありません)

この問題を回避し、彼の当初の目標の意図を尊重するために、私は次のことを行いました。

<PropertyGroup>
    <OnAfter_WPPCopyWebApplication>
        MvcBuildViews;
    </OnAfter_WPPCopyWebApplication>
</PropertyGroup>

<Target Name="MvcBuildViews" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
3
Peter McEvoy

.csprojファイルで次の設定を変更したことを意味していると思います。

<MvcBuildViews>true</MvcBuildViews>

質問に投稿した設定には触れないでください。ローカルマシンで動作する場合は、明らかにASP.NETMVCアプリケーションを事前に構築できます。

TFSビルド環境とローカルVSマシンの違いを追跡する必要があると思います。多分それはMsBuildか何かの異なるバージョンを使用しています。

詳細な出力を使用して両方のビルドを実行し、2つを比較して、何が異なるかを確認してください。

1
Haacked

受け入れられた答えは私にはうまくいきませんでした。 $(PublishDir)パラメーターが正しい場所を指していませんでした。代わりに私は使用しなければなりませんでした:

  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler Condition="'$(IsDesktopBuild)' != 'false'" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
    <AspNetCompiler Condition="'$(IsDesktopBuild)' == 'false'" VirtualPath="temp" PhysicalPath="$(OutDir)\_PublishedWebsites\$(ProjectName)" />
  </Target>
0
Paul Batum

これはまだテスト中ですが、false/trueをタグセットからDEBUGビルドバージョンのプロパティグループに移動できるようです。それでもtrueに設定すると、MSBuildがコンパイルされます(MSBuild TfsBuild.projを想定)ファイルは、デバッグ構成以外のものを使用するように設定されています)。これを行うには、メモ帳を使用してcsprojファイルを編集する必要があります。

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <MvcBuildViews>true</MvcBuildViews>
    ....

MVCBuildViewsタグを上のデフォルトのプロパティグループからデバッグ構成プロパティグループ(下)に移動する必要があります。繰り返しになりますが、TFS/MSBuildのセットアップを取得したら、TFSBuild.projファイルに追加した手順をTFSに投稿しようとします。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <MvcBuildViews>true</MvcBuildViews>
    <DebugSymbols>true</DebugSymbols>
    ....
0
Flip

この問題は、ここで説明した問題と似ているようです: http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx =ビルドマシンのMVCプロジェクトのbinフォルダーにないため、aspnet_compiler.exeの呼び出しでバイナリを見つけることができないようです。私はまだ解決策を考え出していません。

0
Jeremy Thomas

ソース管理に、ソリューションに表示されていない古いフォルダーがいくつかありました。

0
zvolkov