ASP.NET MVC 1.0 AfterBuildingビューは、TFSのビルドに失敗します
-
09-09-2019 - |
質問
私は、ASP.NET MVCベータ版から1.0にアップグレードし、MVCプロジェクトを次のように変更(RCリリースノートにdescibedとして)やってきます:
を<Project ...>
...
<MvcBuildViews>true</MvcBuildViews>
...
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
</Target>
...
</Project>
ビルドが私たちの地元のdevのボックスに細かい動作しますが、、それは「型 『xxx.MvcApplication』をロードできませんでした」とTFS 2008のビルドの下に失敗し、ビルドログの下に参照してください。
...
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サーバー上のVisual Studioインスタンス内で構築されたときにソリューションをコンパイルします。
私は問題を作成し、このTFSを解決するにはどうすればよい?
解決
問題は、ASP.NET MVCプロジェクトのAfterBuildターゲット内で使用AspNetCompilerのMSBuildタスクは、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 / TFS 2008で動作するはずです。
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
私は、カスタムの目標(というよりもオーバーライドAfterBuild)と一緒に、このアプローチを使用するようにするために彼らのプロジェクトテンプレートを更新するために、MVCチームと協力するつもりです。
私はどのように<のhref = "http://blogs.msdn.com/jimlamb/archive/2010/04/20/turn-on-compile-time-view-checking-へのブログ記事を公開しました以下のため-ASP-NET-MVC-プロジェクト・イン・TFS-ビルド2010.aspx」のrel = "noreferrer"> 2010 に構築するTFSにおけるASP.NET MVCプロジェクトの確認コンパイル時ビューをオンにします。
ジム・ラムのソリューションは、私たちのために動作しませんでした。
/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False
ターゲットAfterBuild
を実行していたアプリケーションがまだWebProjectOutputDir
にコピーされていないため。
この問題を回避し、彼の元のターゲットの意思を尊重するために、私は次のようでした。
<PropertyGroup>
<OnAfter_WPPCopyWebApplication>
MvcBuildViews;
</OnAfter_WPPCopyWebApplication>
</PropertyGroup>
<Target Name="MvcBuildViews" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
私はあなたが.csprojファイルに以下の設定を変更した意味と仮定します:
<MvcBuildViews>true</MvcBuildViews>
あなたは、あなたの質問に投稿された設定は触れてはいけません。 それはあなたのローカルマシン上で動作する場合は、明らかにあなたは、ASP.NET MVCアプリケーションを事前に構築することができます。
私はあなたのTFS環境を構築し、ローカルVSマシン間の異なる何追跡する必要があると思います。多分それは、MSBuildのか何かの異なるバージョンを使用しています。
詳細出力を構築し、違うものを見るために2つを比較し、両方実行してください。
我々はまだこれをテストしているが、あなたがあなたの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の設定を取得するときに、再び、私たちはTFSにおける当社のTFSBuild.projファイルに追加のステップを投稿してみましょう。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<MvcBuildViews>true</MvcBuildViews>
<DebugSymbols>true</DebugSymbols>
....
この問題は1に似たようだについてここに話を聞きました: ます。http:// blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspxする aspnet_compiler.exeの呼び出しがインクルードは、ビルドマシン上のMVCプロジェクトのbinフォルダにないので、バイナリを見つけることができないようです。私はまだ解決策を働いていない。
受け入れ答えは私のために動作しませんでした。 $(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>
私は、溶液中で見えなかった私のソースコントロールにいくつかの古いフォルダを持っています。
あなたがすることはできませんASP.NET MVCアプリケーションを事前に構築します。