ASP.NET MVC 1.0 AfterBuilding vues échoue sur la construction de TFS

j'ai mis à jour de ASP.NET MVC bêta à 1,0 et a apporté les changements suivants au projet MVC (tel que décrit dans les notes de mise à jour de RC):

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

alors que le build fonctionne très bien sur nos boîtes dev locales, il ne fonctionne pas sous TFS 2008 Build avec" ne pouvait pas charger type 'xxx.MvcApplication'", voir ci-dessous build log:

...
using "AspNetCompiler" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "AspNetCompiler"

  Command:
  C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_compiler.exe -v temp -p D:BuildsxxxContinuousTeamBuildSourcesUIxxx.UI.Dashboard..xxx.UI.Dashboard 
  The "AspNetCompiler" task is using "aspnet_compiler.exe" from "C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_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 installé sur TFS et la solution compile lorsqu'il est construit dans une instance Visual Studio sur le même TFS serveur.

comment résoudre ce problème de construction de TFS?

61
demandé sur o_o 2009-04-16 15:07:00

9 réponses

le problème provient du fait que la tâche MSBuild AspNetCompiler utilisée dans la cible AfterBuild d'un ASP.NET MVC project s'attend à faire référence aux dll dans le dossier bin du projet Web.

sur une construction de bureau, le dossier bin est là où vous vous y attendriez sous votre arborescence des sources.

cependant TFS Teambuild compile la sortie de votre source dans un répertoire différent sur le serveur de compilation. Quand la tâche AspNetCompiler démarre vous ne pouvez pas trouver le répertoire bin pour faire référence à la DLL requise et vous obtenez l'exception.

la Solution consiste à modifier l'objectif de post-construction du projet MVC comme suit:

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

ce changement vous permet de compiler des vues à la fois sur le bureau et sur le serveur de compilation TFS.

17
répondu crowleym 2009-07-08 14:24:50

en fait, il y a une meilleure solution à ce problème. Je l'ai testé avec VS/TFS 2010 mais il devrait aussi fonctionner avec VS/TFS 2008.

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

je vais travailler avec l'équipe de MVC pour mettre à jour leur modèle de projet afin d'utiliser cette approche avec une cible personnalisée (plutôt que de passer outre AfterBuild).

j'ai publié un billet de blog sur la façon de allumer la vue de compilation pour vérifier ASP.NET projets MVC dans TFS Build 2010 .

179
répondu Jim Lamb 2010-04-20 18:08:33

la solution de Jim Lamb ne marchait pas pour nous quand j'ai construit notre toile .csproj avec

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

parce que la cible était exécutée AfterBuild et que l'application n'a pas encore été copiée dans le WebProjectOutputDir . (BTW, je passe ces propriétés à la construction de projet web parce que je veux que la construction de créer un dossier OutDir avec seulement mes binaires et les fichiers cshtml appropriés pour la fermeture éclair, c'est à dire pas une construction en place)

Pour contourner ce problème et pour respecter l'intention de sa cible initiale, j'ai fait ce qui suit:

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

<Target Name="MvcBuildViews" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
3
répondu Peter McEvoy 2012-11-27 17:07:21

je suppose que vous vouliez dire que vous avez changé le paramètre suivant dans le .dossier csproj:

<MvcBuildViews>true</MvcBuildViews>

le paramètre que vous avez affiché dans votre question ne doit pas être touché. Si cela fonctionne sur votre machine locale, alors évidemment vous pouvez pré-construire un ASP.NET MVC application.

je pense que vous devez trouver ce qui est différent entre votre environnement de construction TFS et vos machines VS locales. Peut-être qu'il utilise une version différente de MsBuild ou quelque chose comme ça.

essayez d'exécuter les deux constructions avec la sortie verbose et comparez les deux pour voir ce qui est différent.

1
répondu Haacked 2009-04-20 16:14:29

nous sommes encore en train de tester ceci, mais il semble que vous pouvez déplacer le false/true à partir de la balise set, dans le groupe de propriété pour votre version de DEBUG build, vous pouvez toujours la définir à true et MSBuild compilera (en supposant que MSBuild TfsBuild.le fichier proj est configuré pour utiliser autre chose que la configuration de débogage). Pour ce faire, vous devrez éditer le fichier csproj en utilisant le bloc-notes.

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

vous devez déplacer la balise MVCBuildViews de la propriété par défaut groupe ci-dessus, à la propriété de configuration de débogage groupe (ci-dessous). Encore une fois, quand nous aurons la configuration de TFS / MSBuild, j'essaierai de poster l'étape que nous avons ajoutée à notre TFSBuild.proj fichier dans TFS.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <MvcBuildViews>true</MvcBuildViews>
    <DebugSymbols>true</DebugSymbols>
    ....
0
répondu 2009-05-28 19:15:33

Ce problème semble similaire à celui parlé ici: http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx il semble l'invocation de aspnet_compiler.exe ne parvient pas à localiser les binaires car ils ne sont pas dans le dossier bin du projet MVC sur la machine de construction. Je n'ai pas travaillé sur une solution encore.

0
répondu Jeremy Thomas 2009-06-04 04:28:03

la réponse acceptée n'a pas fonctionné pour moi. Le paramètre $(PublishDir) ne pointait pas vers la bonne localisation. Au lieu de cela, j'ai dû utiliser:

  <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>
0
répondu Paul Batum 2009-08-06 08:12:26

j'avais quelques vieux dossiers dans mon contrôle source qui n'étaient pas visibles dans la Solution.

0
répondu zvolkov 2011-02-16 20:19:13

vous ne pouvez pas pré-construire un ASP.NET MVC application.

-6
répondu Brad Wilson 2009-04-16 17:34:52