2009-04-16 32 views
60

我從ASP.NET MVC測試版升級到1.0,並做了以下更改MVC項目(如在RC版本說明descibed):ASP.NET MVC 1.0 AfterBuilding意見通過TFS失敗構建

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

雖然構建運行在我們的本地開發盒精緻,它在2008年TFS構建失敗,「無法加載類型‘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服務器上的Visual Studio實例中編譯時編譯。

我該如何解決這個TFS構建問題?

回答

17

該問題源於ASP.NET MVC項目的AfterBuild目標中使用的AspNetCompiler MSBuild任務期望引用Web項目的bin文件夾中的dll。

在桌面上構建bin文件夾是您期望在源代碼樹下的位置。

但是,TFS Teambuild會將源代碼的輸出編譯到構建服務器上的其他目錄。當AspNetCompiler任務啓動時,它無法找到bin目錄來引用所需的DLL,並且您會得到異常。

解決方案是修改了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構建服務器。

+0

這很有效。希望MS相應地更改.csproj文件模板。 – 2009-07-09 10:34:06

+0

多數民衆贊成在瘋狂,爲什麼他們還沒有解決這個問題! ?? – 2010-04-13 08:45:45

-6

您無法預先構建ASP.NET MVC應用程序。

+0

請參閱Jim Lamb的解答以獲得正確的解決方案。 – 2011-04-01 08:43:19

1

我假設你的意思是你在.csproj的文件中更改以下設置:

<MvcBuildViews>true</MvcBuildViews> 

的設置會在你的問題貼不應該被感動。 如果它在你的本地機器上工作,那麼顯然你可以預先構建一個ASP.NET MVC應用程序。

我認爲你需要追蹤你的TFS構建環境和本地VS機器之間的不同。也許它使用的是不同版本的MsBuild或其他東西。

嘗試使用詳細輸出執行兩個構建,並比較兩者以查看有什麼不同。

+0

TFS中使用的路徑似乎與我的本地機器和源代碼控制中的完全不同,因此您必須爲每個場景指定不同的位置。 – Leather 2009-10-19 15:14:32

+0

@haacked這是怎麼來沒有在模板中更新?它第一次遇到它時非常混亂。特別是所有那些新的'TFS Basic'用戶不習慣處理像這樣的事情 – 2010-04-13 23:26:00

0

我們仍在測試,但似乎可以將標記集中的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設置時,我會嘗試將我們添加到TFS中的TFSBuild.proj文件的步驟發佈。

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

接受的答案不適用於我。 $(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> 
178

實際上,這個問題有更好的解決方案。我曾與VS/TFS 2010測試,但它也應該能VS/TFS 2008年工作

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

我要與MVC團隊合作,以更新他們的項目模板使用連同這種方法一個自定義目標(而不是重寫AfterBuild)。

我發表了一篇關於如何到Turn on Compile-time View Checking for ASP.NET MVC projects in TFS Build 2010的博客文章。

0

我的源代碼管理中有一些舊的文件夾在解決方案中不可見。

3

當我建立了我們的網站的.csproj與

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False 

因爲目標正在執行AfterBuild和應用尚未被複制到WebProjectOutputDir尚未吉姆羔羊的解決方案並沒有爲我們工作。 (順便說一句,我將這些屬性傳遞給web項目構建因爲我希望構建創建OutDir文件夾,只有我的二進制文件和適合壓縮的二進制文件和cshtml文件,即不是就地構建)

解決此問題並尊重他的原始目標的意圖,我做了以下事情:

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

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