ASP.NET MVC 1.0 AfterBuilding Views не работает в сборке TFS - PullRequest
61 голосов
/ 16 апреля 2009

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

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

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

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

Ответы [ 9 ]

179 голосов
/ 20 апреля 2010

На самом деле, есть лучшее решение этой проблемы. Я протестировал его с 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 .

17 голосов
/ 08 июля 2009

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

В настольной сборке папка bin находится там, где вы ожидаете ее в дереве исходных текстов.

Однако TFS Teambuild компилирует вывод вашего исходного кода в другой каталог на сервере сборки. Когда запускается задача AspNetCompiler, она не может найти каталог bin, ссылающийся на требуемую 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>

Это изменение позволяет вам компилировать Views как на рабочем столе, так и на сервере сборки TFS.

3 голосов
/ 27 ноября 2012

Решение Джима Лэмба не работало для нас, когда я создавал наш веб-сайт .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>
1 голос
/ 20 апреля 2009

Полагаю, вы имели в виду, что изменили следующую настройку в файле .csproj:

<MvcBuildViews>true</MvcBuildViews>

Настройка, которую вы разместили в своем вопросе, не должна быть затронута. Если он работает на вашем локальном компьютере, то, очевидно, вы можете предварительно собрать приложение ASP.NET MVC.

Я думаю, вам нужно отследить, что отличается между вашей средой сборки TFS и вашими локальными машинами VS. Возможно, он использует другую версию MsBuild или что-то в этом роде.

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

0 голосов
/ 16 февраля 2011

В моем контроле исходного кода были старые папки, которые не были видны в решении.

0 голосов
/ 06 августа 2009

Принятый ответ не сработал для меня. Параметр $ (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>
0 голосов
/ 04 июня 2009

Эта проблема похожа на ту, о которой говорилось здесь: http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx кажется, что при вызове aspnet_compiler.exe не удается найти двоичные файлы, поскольку они не находятся в папке bin проекта MVC на компьютере сборки. Я еще не разработал решение.

0 голосов
/ 28 мая 2009

Мы все еще тестируем это, но похоже, что вы можете переместить false / true из набора тегов в группу свойств для вашей версии сборки DEBUG, вы все равно можете установить его в 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>
    ....
0 голосов
/ 16 апреля 2009

Невозможно предварительно создать приложение ASP.NET MVC.

...