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ビルドの問題を解決するにはどうすればよいですか?
この問題は、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ビルドサーバーの両方でビューをコンパイルできるようになります。
実際、この問題にはもっと良い解決策があります。 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プロジェクトのコンパイル時ビューチェックをオンにする に関するブログ投稿を公開しました。
私が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>
.csprojファイルで次の設定を変更したことを意味していると思います。
<MvcBuildViews>true</MvcBuildViews>
質問に投稿した設定には触れないでください。ローカルマシンで動作する場合は、明らかにASP.NETMVCアプリケーションを事前に構築できます。
TFSビルド環境とローカルVSマシンの違いを追跡する必要があると思います。多分それはMsBuildか何かの異なるバージョンを使用しています。
詳細な出力を使用して両方のビルドを実行し、2つを比較して、何が異なるかを確認してください。
受け入れられた答えは私にはうまくいきませんでした。 $(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>
これはまだテスト中ですが、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>
....
この問題は、ここで説明した問題と似ているようです: http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx =ビルドマシンのMVCプロジェクトのbinフォルダーにないため、aspnet_compiler.exeの呼び出しでバイナリを見つけることができないようです。私はまだ解決策を考え出していません。
ソース管理に、ソリューションに表示されていない古いフォルダーがいくつかありました。