Проблема one-click publish и MvcBuildViews в asp.net MVC

При использовании one-click publish я как-то раз столкнулся с подобной ошибкой:

It is an error to use section registered as allowDefinition=’MachineToApplication’ beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

Происходит она при попытке компиляции проекта после первого же паблиша (на удаленный сервер или даже в локальную папку).
Столкнувшись сегодня с ней во второй раз и осознав, что я не помню, «что это было» и как это лечится, решил написать заметку.

Корень проблемы в том, что по-умолчанию публикация происходит в папку obj/Debug(Release) внутри mvc-проекта. В результате публикации, в этих папках появляются файлы web.config.
Если при этом проект настроен на компиляцию вьюшек (MvcBuildViews = true), то при запуске этой самой компиляции msbuild пытается воспроизвести вокруг вьюшек iis-окружение, а этому мешают неожиданные web.config’и во вложенных папках (msbuild’у кажется, что в папке obj/Debug у нас вложенный сайт, а как отдельное приложение он эта папка не сконфигурирована). Об этом собственно и говорит сообщение об ошибке, но очень уж завуалированно :)

Первое очевидное решение — это очистка папки obj/Debug(/Release) перед сборкой (например, через Clean Solution), но постоянно повторять эти действия слегка надоедает :)
Альтернативное и более «чистое» решение — смена папки публикации, чтобы она не находилась внутри MVC-проекта. Сделать это можно добавив в .csproj файл следующую строчку:

<MvcBuildViews>true</MvcBuildViews> <!-- эта строчка у вас скорее всего уже есть, иначе проблемы бы не было :)) -->
<BaseIntermediateOutputPath>../build</BaseIntermediateOutputPath>

Промежуточная публикация при этом будет происходить в папку build на уровень выше вашего проекта, что не помешает дальнейшим компиляциям вьюшек.
(при этом удалить содержимое папки obj/Debug/Release один раз таки-придется руками :))

Опубликовать в Facebook
Опубликовать в Google Plus

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *