문제

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>

빌드는 로컬 개발자 상자에서 잘 작동하지만 "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 프로젝트의 애프터 빌드 대상 내에서 사용 된 ASPNetComPiler MSBuild 작업이 웹 프로젝트의 빈 폴더에서 DLL을 참조 할 것으로 예상한다는 사실에서 비롯됩니다.

데스크탑에서 BIN 폴더는 소스 트리 아래에 기대할 수있는 곳입니다.

그러나 TFS TeamBuild는 소스의 출력을 빌드 서버의 다른 디렉토리로 컴파일합니다. ASPNetCompiler 작업이 시작되면 필요한 DLL을 참조 할 BIN 디렉토리를 찾을 수 없으며 예외가 나타납니다.

솔루션은 MVC 프로젝트의 애프터 빌드 대상을 다음과 같이 수정하는 것입니다.

  <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 팀과 협력하여 프로젝트 템플릿을 업데이트 하여이 접근 방식을 사용하여 (애프터 빌드를 재정의하지 않고) 사용자 정의 대상을 사용합니다.

How To에 대한 블로그 게시물을 게시했습니다 TFS 빌드 2010에서 ASP.NET MVC 프로젝트 확인 컴파일 타임보기 켜기.

Jim Lamb의 솔루션은 Web .csproj를 만들었을 때 우리에게 효과가 없었습니다.

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

대상이 실행 되었기 때문에 AfterBuild 그리고 응용 프로그램은 WebProjectOutputDir 아직. (BTW, 나는 해당 속성을 웹 프로젝트 빌드 cos에 전달합니다. 빌드가 내 바이너리와 Zipping에 적합한 CSHTML 파일만으로 아웃 디르 폴더를 만들기를 원합니다, 즉 내내 빌드가 아닙니다).

이 문제를 해결하고 그의 원래 목표의 의도를 존중하기 위해 다음을 수행했습니다.

<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 빌드 환경과 로컬 대 기계의 다른 점을 추적해야한다고 생각합니다. 어쩌면 그것은 다른 버전의 msbuild 또는 무언가를 사용하고있을 것입니다.

장점 출력으로 두 빌드를 모두 수행하고 두 가지를 비교하여 다른 점을 확인하십시오.

우리는 여전히 이것을 테스트하고 있지만 태그 세트에서 거짓/true를 디버그 빌드 버전의 속성 그룹으로 이동할 수있는 것으로 보이면 여전히 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 설정을 받으면 TFSBuild.proj 파일에 추가 된 단계를 TFS로 게시하려고합니다.

  <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-debloyment-projects.aspxASPNET_COMPILER.EXE의 호출은 빌드 머신의 MVC 프로젝트의 빈 폴더에 없기 때문에 바이너리를 찾지 못하는 것 같습니다. 아직 해결책을 찾지 못했습니다.

받아 들여진 대답은 나에게 효과가 없었습니다. $ (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 응용 프로그램을 사전 구축 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top