ASP.NET MVC 1.0 AfterBuilding Views не работает в TFS Build
Я обновил версию 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>
Пока сборка отлично работает в наших локальных блоках dev, она не работает в 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?
Ответы
Ответ 1
Проблема связана с тем, что задача 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>
Это изменение позволяет вам скомпилировать представления как на рабочем столе, так и на сервере сборки TFS.
Ответ 2
На самом деле, есть лучшее решение этой проблемы. Я тестировал его с помощью 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.
Ответ 3
Решение Jim Lamb не сработало для нас, когда я построил наш web.csproj с помощью
/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False
поскольку цель была выполнена AfterBuild
, и приложение еще не было скопировано в WebProjectOutputDir
. (BTW, я передаю эти свойства в сборку веб-проектов, потому что я хочу, чтобы сборка создавала папку OutDir с только моими двоичными файлами и cshtml файлами, подходящими для zipping, т.е. Не для сборки на месте)
Чтобы обойти эту проблему и почтить намерение своей первоначальной цели, я сделал следующее:
<PropertyGroup>
<OnAfter_WPPCopyWebApplication>
MvcBuildViews;
</OnAfter_WPPCopyWebApplication>
</PropertyGroup>
<Target Name="MvcBuildViews" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
Ответ 4
Я предполагаю, что вы имели в виду, что вы изменили следующий параметр в файле .csproj:
<MvcBuildViews>true</MvcBuildViews>
Нельзя трогать настройку, опубликованную в вашем вопросе.
Если он работает на вашей локальной машине, то, очевидно, вы можете предварительно создать приложение ASP.NET MVC.
Я думаю, вам нужно отследить, что отличает ваша среда сборки TFS от ваших локальных машин VS. Возможно, он использует другую версию MsBuild или что-то в этом роде.
Попробуйте выполнить сборку с подробным выводом и сравните два, чтобы увидеть, что другое.
Ответ 5
Мы все еще проверяем это, но, похоже, вы можете переместить false/true из набора тегов в группу свойств для своей версии сборки DEBUG, вы все равно можете установить ее в true и MSBuild будет компилироваться (если MSBuild Файл TfsBuild.proj настроен на использование чего-то другого, кроме конфигурации отладки). Вам нужно будет отредактировать файл csproj с помощью Notepad, чтобы выполнить это.
<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>
....
Ответ 6
Эта проблема кажется похожей на ту, о которой говорилось здесь:
http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx
кажется, что вызов aspnet_compiler.exe не может найти двоичные файлы, потому что они не находятся в папке bin проекта MVC на машине сборки. Я еще не разработал решение.
Ответ 7
Принятый ответ не помог мне. Параметр $(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>
Ответ 8
У меня были некоторые старые папки в моем исходном элементе управления, которые не были видны в решении.
Ответ 9
Вы не можете предварительно создать приложение ASP.NET MVC.