Сбой сборки MVC3 из-за web.config в папке obj

У меня есть <MvcBuildViews>true</MvcBuildViews> настройка в моих файлах проекта.

Теперь, когда я развертываю первый раз, я получаю файлы в obj\release\package\packagetmp. Каждая последующая сборка после этого приводит к сбою сборки.

Web -> C:\Projects\ProjectX\Web\bin\ProjectX.Web.dll
C:\Projects\ProjectX\Web\obj\release\package\packagetmp\web.config(64): 
error ASPCONFIG: It is an error to use a 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.
------ Skipped Publish: Project Web, Configuration: Release Any CPU ------

Теперь, если вы удалите папку obj, я могу построить штраф.

Это довольно неприятно, если любая сборка завершилась неудачей после публикации, пока я вручную не удалю папку obj. Есть ли что-нибудь, что я могу сделать, чтобы исправить это?

Ответы

Ответ 1

Добавьте это в файл .csproj:

<Target Name="AfterBuild" Condition="'$(Configuration)'=='Release'">
  <RemoveDir Directories="$(IntermediateOutputPath)" />
</Target>

Кажется, нужно удалить файлы в obj\Release, но не в самой папке, по крайней мере на моей машине.

Ответ 2

Эта проблема возникает, потому что MvcBuildViews конфликтует с упаковкой Web Deploy. Я получил идею этого решения от http://www.zvolkov.com/clog/2011/02/16/asp-net-razor-lessons-learned/:

  <PropertyGroup>
    <PackageDependsOn Condition="'$(DeployOnBuild)'=='true'">
      CleanWebsitesPackage;
      CleanWebsitesPackageTempDir;
      CleanWebsitesTransformParametersFiles;
      MvcBuildViews;
      $(PackageDependsOn)
    </PackageDependsOn>
    <BuildDependsOn Condition="'$(DeployOnBuild)'!='true'">
      $(BuildDependsOn);
      MvcBuildViews
    </BuildDependsOn>
  </PropertyGroup>

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

Теперь AspNetCompiler будет запущен перед упаковкой. Это хорошо работает с подходом msbuild/p: DeployOnBuild = True/p: DeployTarget = Package.

Ответ 3

Это известная проблема с MVC при включении функции просмотра MVC. Надеюсь, они исправят его в следующей версии.

В то же время вы можете запустить операцию "Чистое решение", чтобы очистить папку obj, а не выполнять ее вручную. Недостатком является то, что все ваше решение будет перестраиваться каждый раз.

Еще один вариант, который я еще не сделал, но рассмотрел, если мой проект становится больше, является предварительным компилятором в проекте MVC для удаления web.config из obj\