ASP.NET MVC 1.0 AfterBuilding Views завершается неудачей при сборке TFS


я обновился с ASP.NET MVC Beta to 1.0 и внес следующие изменения в проект MVC (как описано в примечаниях к выпуску RC):

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

в то время как сборка работает нормально на наших локальных коробках dev, она терпит неудачу при сборке 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: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 устанавливается на TFS, и решение компилируется при сборке в экземпляре Visual Studio на том же сервере TFS.

Как я могу решить эту проблему сборки TFS?

9 61

9 ответов:

проблема связана с тем, что задача AspNetCompiler MSBuild используется в целевом объекте AfterBuild ASP.NET проект MVC ожидает ссылаться на dll в папке bin веб-проекта.

на рабочем столе построить папку bin, где вы ожидали бы его под вашим исходным деревом.

однако TFS Teambuild компилирует выходные данные вашего источника в другой каталог на сервере сборки. При запуске задачи AspNetCompiler не удается найти ячейку каталог для ссылки на необходимую библиотеку DLL, и вы получите исключение.

решение состоит в том, чтобы изменить цель AfterBuild проекта 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, чтобы обновить свой шаблон проекта, чтобы использовать этот подход вместе с пользовательской целью (а не переопределять AfterBuild).

я опубликовал сообщение в блоге о том, как включить проверку представления во время компиляции ASP.NET проекты MVC в TFS Build 2010.

решение Джима Лэмба не сработало для нас, когда я построил нашу сеть .csproj файл с

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

потому что цель была выполнена AfterBuild и приложение не было скопировано в WebProjectOutputDir еще. (Кстати, я передаю эти свойства в сборку веб-проекта, потому что я хочу, чтобы сборка создавала папку OutDir только с моими двоичными файлами и файлами 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 и ваших локальных машин VS. Может быть, он использует другую версию MsBuild или что-то в этом роде.

попробуйте выполнить оба строит с подробным выводом и сравнивает их, чтобы увидеть, что отличается.

мы все еще тестируем это, но похоже, что вы можете переместить false/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-deployment-projects.aspx кажется, призвание же.exe не удается найти двоичные файлы, потому что они не находятся в папке bin проекта 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.