Pregunta

He actualizado desde ASP.NET MVC Beta a 1,0 e hice los siguientes cambios en el proyecto MVC (según lo expuesto en las notas de la versión RC):

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

Mientras que la acumulación funciona muy bien en nuestras cajas dev locales, se produce un error en TFS 2008 Build con "No se pudo cargar el tipo 'xxx.MvcApplication'", véase más adelante registro de generación:

...
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 en TFS y la solución compila cuando se construyó dentro de una instancia de Visual Studio en el mismo servidor de TFS.

¿Cómo puedo resolver este problema TFS Build?

¿Fue útil?

Solución

El problema se deriva del hecho de que la tarea de MSBuild AspNetCompiler utilizado dentro de la meta AfterBuild de un proyecto ASP.NET MVC espera para hacer referencia a las DLL en la carpeta bin del proyecto Web.

En un escritorio construir la carpeta bin es donde se espera que bajo su árbol de fuentes.

Sin embargo TFS TeamBuild compila la salida de la fuente a un directorio diferente en el servidor de compilación. Cuando se inicia la tarea AspNetCompiler que no puede encontrar el directorio bin para hacer referencia al archivo DLL requerido y se obtiene la excepción.

La solución es modificar el objetivo AfterBuild del Proyecto MVC ser de la siguiente manera:

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

Este cambio le permite compilar Vistas tanto en el escritorio, y el TFS construir servidor.

Otros consejos

En realidad, hay una mejor solución a este problema. Lo he probado con VS / TFS 2010, pero también debería funcionar con VS / TFS 2008.

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

Voy a trabajar con el equipo de MVC para actualizar su plantilla de proyecto a utilizar este método junto con un objetivo de medida (en vez de invalidar AfterBuild).

He publicado una entrada de blog sobre cómo a su vez en tiempo de compilación Ver Comprobación de proyectos ASP.NET MVC en TFS Build 2010 .

solución

de Jim Lamb no funcionó para nosotros cuando construí nuestra web con .csproj

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

debido a que el objetivo se está ejecutando AfterBuild y la aplicación no se ha copiado en el WebProjectOutputDir todavía. (Por cierto, paso a aquellas propiedades del proyecto web construir porque yo quiero que la acumulación de crear una carpeta OutDir con sólo mis archivos binarios y cshtml adecuado para comprimir, es decir, no una actualización in situ de construcción)

Para obtener este problema y cumplir con la intención de su objetivo original, hice lo siguiente:

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

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

supongo que quería decir que ha cambiado la siguiente configuración en el archivo .csproj:

<MvcBuildViews>true</MvcBuildViews>

La configuración que ha escrito en su pregunta no debe ser tocado. Si funciona en su máquina local, entonces, evidentemente, se puede pre-construir una aplicación ASP.NET MVC.

Creo que se necesita para rastrear a lo que es diferente entre el entorno de TFS construir y sus máquinas locales VS. A lo mejor es utilizar una versión diferente de MSBUILD o algo así.

Trate de realizar tanto construye con salida detallada y comparar los dos para ver lo que es diferente.

Todavía estamos probando esto, pero parece que se puede mover el verdadero / falso de la etiqueta de conjunto, en el grupo de propiedades para su versión versión de depuración, todavía se puede establecer en true y MSBuild compilará (suponiendo MSBuild TFSBuild.proj archivo está configurado para utilizar algo distinto de configuración de depuración). Usted tendrá que editar el archivo csproj el Bloc de notas para lograr esto.

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

Es necesario mover la etiqueta MVCBuildViews del grupo propiedad predeterminada anteriormente, para el grupo de propiedades de configuración de depuración (abajo). Una vez más, cuando tenemos la configuración TFS / MSBuild, voy a tratar de publicar el paso hemos añadido a nuestro archivo TFSBuild.proj en TFS.

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

Este problema parece similar a la que hablaron de aquí: http: // blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx parece que la invocación de aspnet_compiler.exe no puede localizar los binarios porque el no se encuentran en la carpeta bin del proyecto MVC en la máquina de construcción. No he trabajado a cabo una solución todavía.

La respuesta aceptada no funcionó para mí. El parámetro $ (PublishDir) no apuntaba a la ubicación correcta. En cambio, tuve 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>

Yo tenía algunas carpetas viejas en mi control de origen que no eran visibles en la solución.

No se puede pre-construir una aplicación ASP.NET MVC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top