ASP.NET MVC 1.0 AfterBuilding视图在TFS Build上失败

我已经从ASP.NET MVC Beta升级到1.0,并对MVC项目进行了以下更改(如RC发行说明中所述):

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

虽然构build在我们的本地开发框上运行良好,但在TFS 2008 Build下使用“无法加载typesxxx.MvcApplication”失败,请参阅下面的构build日志:

 ... 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上,解决scheme在同一台TFS服务器上的Visual Studio实例中编译。

我该如何解决这个TFS构build问题?

这个问题源于ASP.NET MVC项目的AfterBuild目标中使用的AspNetCompiler MSBuild任务期望引用Web项目的bin文件夹中的dll。

在桌面版本上,bin文件夹是您期望在源代码树下的位置。

但是,TFS Teambuild会将源代码的输出编译到构build服务器上的其他目录。 当AspNetCompiler任务启动时,它不能findbin目录来引用所需的DLL,你会得到exception。

解决scheme是修改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构build服务器上编译视图。

事实上,这个问题有更好的解决办法。 我已经用VS / TFS 2010testing了它,但是它也应该和VS / TFS 2008一起工作。

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

我将与MVC团队一起更新他们的项目模板,以便使用此方法以及自定义目标(而不是覆盖AfterBuild)。

我已经发布了一篇关于如何在TFS Build 2010中打开编译时查看检查ASP.NET MVC项目的博客文章。

当我使用.csproj创build我们的web .csproj时,Jim Lamb的解决scheme对我们不起作用

 /p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False 

因为目标正在执行AfterBuild并且应用程序尚未被复制到WebProjectOutputDir 。 (顺便说一下,我将这些属性传递给Web项目构build因为我希望构build创buildOutDir文件夹,只有我的二进制文件和cshtml文件适合压缩,即不是就地生成)

为了解决这个问题,并尊重他原来的目标的意图,我做了以下工作:

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

我假设你的意思是你在.csproj文件中改变了以下设置:

 <MvcBuildViews>true</MvcBuildViews> 

您在问题中发布的设置不应该被触及。 如果它在你的本地机器上工作,那么显然你可以预先构build一个ASP.NET MVC应用程序。

我想你需要跟踪你的TFS编译环境和本地的VS机器有什么不同。 也许它使用的是不同版本的MsBuild或其他东西。

尝试使用详细的输出执行这两个版本,并比较两者,看看有什么不同。

我们仍然在testing,但似乎可以将标记集中的false / true移动到您的DEBUG构build版本的属性组中,您仍然可以将其设置为true,并且可以编译MSBuild(假设MSBuild TfsBuild.proj文件被设置为使用除debuggingconfiguration以外的东西)。 您将需要使用记事本编辑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标记从上面的默认属性组移动到debuggingconfiguration属性组(如下所示)。 同样,当我们获得TFS / MSBuild设置时,我会尝试将我们添加到TFS中的TFSBuild.proj文件的步骤发布。

  <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它似乎调用aspnet_compiler .exe无法find二进制文件,因为它们不在生成机器上的MVC项目的bin文件夹中。 我还没有制定出解决scheme。

接受的答案不适合我。 $(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> 

我的源代码pipe理中有一些旧的文件夹在解决scheme中不可见。

您不能预先构buildASP.NET MVC应用程序。