Pergunta

Eu tenho atualizado a partir de ASP.NET MVC Beta para 1,0 e fez as seguintes alterações no projeto MVC (como descrito nas notas de lançamento RC):

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

Enquanto a construção funciona muito bem em nossas caixas dev locais, ele falhar sob TFS 2008 Construir com "Não foi possível carregar o tipo 'xxx.MvcApplication'", veja abaixo log de compilação:

...
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 está instalado no TFS e as compila solução quando construído dentro de uma instância de Visual Studio no mesmo servidor TFS.

Como posso resolver esse problema TFS construir?

Foi útil?

Solução

O problema decorre do fato de que a tarefa AspNetCompiler MSBuild usado dentro da meta AfterBuild de uma espera de projeto ASP.NET MVC para fazer referência a dll de na pasta bin do projeto da Web.

Em uma compilação de desktop a pasta bin é onde você esperaria que sob sua árvore fonte.

No entanto TFS TeamBuild compila a saída de sua fonte para um diretório diferente no servidor de compilação. Quando a tarefa AspNetCompiler começa não pode encontrar o diretório bin para fazer referência a DLL exigida e você começa a exceção.

A solução é modificar o alvo AfterBuild do Projeto MVC a ser a seguinte:

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

Esta alteração permite que você compilar Visualizações tanto no ambiente de trabalho e o servidor TFS construção.

Outras dicas

Na verdade, há uma melhor solução para este problema. Eu testei com VS / TFS 2010, mas deve também trabalhar com VS / TFS 2008.

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

Eu estou indo para o trabalho com a equipe MVC para atualizar seu modelo de projeto para usar essa abordagem, juntamente com um alvo personalizado (em vez de substituir AfterBuild).

Eu já publicou um post sobre como Ligue de tempo de compilação Ver a verificação de projetos ASP.NET MVC em TFS construir 2010 .

A solução de Jim Lamb não funcionou para nós quando eu construímos a nossa web .csproj com

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

porque o alvo estava sendo executado AfterBuild eo pedido não foi copiado para o WebProjectOutputDir ainda. (BTW, eu passar essas propriedades para a construção do projeto web cos eu quero a construção para criar uma pasta OutDir com apenas os binários e arquivos cshtml adequados para fechar, ou seja, não uma compilação in-place)

Para contornar este problema e honrar a intenção de seu alvo original, eu fiz o seguinte:

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

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

Presumo que significava que você mudou a seguinte configuração no arquivo csproj:

<MvcBuildViews>true</MvcBuildViews>

A configuração que você postou sua pergunta não deve ser tocado. Se ele funciona em sua máquina local, então, obviamente, você pode pré-construir uma aplicação ASP.NET MVC.

Eu acho que você precisa para rastrear o que é diferente entre o ambiente TFS construção e suas máquinas VS locais. Talvez ele está usando uma versão diferente do MsBuild ou algo assim.

Tente realizar tanto constrói com detalhado de saída e comparar os dois para ver o que é diferente.

Ainda estamos testando isso, mas parece que você pode mover o falso / verdadeiro do conjunto de tag, no grupo de propriedades para o seu DEBUG versão de compilação, você ainda pode configurá-lo como true e MSBuild irá compilar (assumindo MSBuild arquivo TFSBuild.PROJ está configurado para usar algo diferente do que a configuração de depuração). Você precisará editar o arquivo csproj usando o bloco de notas para alcançar este objetivo.

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

Você precisa mover a tag MVCBuildViews do grupo propriedade padrão acima, com o grupo de propriedade de configuração de depuração (abaixo). Mais uma vez, quando chegarmos a instalação TFS / MSBuild, vou tentar postar o passo nós adicionamos ao nosso arquivo TFSBuild.proj no TFS.

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

Este problema parece semelhante ao que falou aqui: http: // blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx parece que a invocação de aspnet_compiler.exe não consegue localizar os binários porque o não estão na pasta bin do projeto MVC na máquina de compilação. Eu não tenho trabalhado para fora uma solução ainda.

A resposta aceita não funcionou para mim. O parâmetro $ (PublishDir) não apontam para o local correto. Em vez disso eu tive que usar:

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

Eu tive algumas pastas antigas em meu controle de origem que não eram visíveis na solução.

Você não pode pré-construir uma aplicação ASP.NET MVC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top