Programing

ASP.NET MVC 1.0 AfterBuilding 뷰가 TFS 빌드에서 실패 함

lottogame 2020. 11. 26. 07:42
반응형

ASP.NET MVC 1.0 AfterBuilding 뷰가 TFS 빌드에서 실패 함


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>

빌드가 로컬 개발 상자에서 제대로 실행되지만 TFS 2008 빌드에서 " '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 빌드 문제를 어떻게 해결할 수 있습니까?


문제는 ASP.NET MVC 프로젝트의 AfterBuild 대상 내에서 사용되는 AspNetCompiler MSBuild 작업이 웹 프로젝트의 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>

저는 MVC 팀과 협력하여이 접근 방식을 사용자 지정 대상과 함께 사용하도록 프로젝트 템플릿을 업데이트 할 것입니다 (AfterBuild를 재정의하는 대신).

TFS Build 2010에서 ASP.NET MVC 프로젝트에 대한 컴파일 시간보기 검사를 설정하는 방법에 대한 블로그 게시물을 게시했습니다 .


Jim Lamb의 솔루션은 웹 .csproj를 다음과 같이 구축했을 때 작동하지 않았습니다.

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

대상이 실행 중이고 AfterBuild응용 프로그램이 아직에 복사 WebProjectOutputDir되지 않았기 때문입니다. (BTW, 해당 속성을 웹 프로젝트 빌드에 전달합니다. 즉, 내부 빌드가 아닌 압축에 적합한 바이너리 및 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.NET MVC 응용 프로그램을 미리 빌드 할 수 있습니다.

I think you need to track down what's different between your TFS build environment and your local VS machines. Maybe it's using a different version of MsBuild or something.

Try performing both builds with verbose output and compare the two to see what's different.


We are still testing this out, but it appears that you can move the false/true from the tag set, into the property group for your DEBUG build version, you can still set it to true and MSBuild will compile (assuming MSBuild TfsBuild.proj file is setup to use something other than debug configuration). You will need to edit the csproj file using Notepad to accomplish this.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <MvcBuildViews>true</MvcBuildViews>
    ....

You need to move the MVCBuildViews tag from the default property group above, to the debug configuration property group (below). Again, when we get the TFS / MSBuild setup, I'll try to post the step we added to our TFSBuild.proj file in TFS.

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

This problem seems similar to the one talked about here: http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx it seems the invocation of aspnet_compiler.exe fails to locate the binaries because the are not in the bin folder of the MVC project on the build machine. I haven't worked out a solution yet.


The accepted answer didn't work for me. The $(PublishDir) parameter did not point to the correct location. Instead I had to use:

  <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>

I had some old folders in my source control that were not visible in the Solution.


You cannot pre-build an ASP.NET MVC application.

참고URL : https://stackoverflow.com/questions/755645/asp-net-mvc-1-0-afterbuilding-views-fails-on-tfs-build

반응형