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应用程序。