MVCBuildViews не работает правильно - PullRequest
48 голосов
/ 18 января 2011

Таким образом, я отредактировал свой файл csproj в RTM-приложении MVC 3, чтобы установить следующее свойство:

<MvcBuildViews>true</MvcBuildViews>

Это должно привести к тому, что мои представления будут выполняться во время сборки, и вызвать ошибку сборки, если мое представление нарушено,Это единственное изменение, которое я сделал, однако, когда я пытаюсь построить приложение, я получаю следующую ошибку:

Ошибка использовать раздел, зарегистрированный как allowDefinition = 'MachineToApplication' за пределами приложенияуровень.Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.

Проект компилируется и запускается успешно, если я вернусь к значению false,

Ниже приведенызадачи сборки, настроенные в файле csproj (они никогда не редактировались вручную, они были добавлены Visual Studio 2010)

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

Я что-то здесь упускаю?Как правильно настроить MVC 3 / Visual Studio 2010 для проверки моих представлений во время сборки?

Ответы [ 5 ]

54 голосов
/ 18 января 2011

У меня была эта проблема несколько дней назад, и я исправил ее, удалив папку obj / Debug.Очистка проекта тоже работает.Тем не менее, я понятия не имею о причине проблемы.

См. Ответ Джо Картано для более постоянного решения.

37 голосов
/ 09 февраля 2013

Эта проблема возникает, когда в папке obj есть выходные данные веб-проекта (templated web.config или временные файлы публикации). Используемый компилятор ASP.NET недостаточно умен, чтобы игнорировать вещи в папке obj, поэтому вместо этого он выдает ошибки.

Еще одно исправление - обнулить вывод публикации прямо перед вызовом . Откройте ваш .csproj и измените это:

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

к этому:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <ItemGroup>
    <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
    <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" />
  </ItemGroup>
  <Delete Files="@(ExtraWebConfigs)" />
  <RemoveDir Directories="@(ExtraPackageTmp)" />
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

Это удалит все web.configs в \ obj, а также все папки PackageTmp в \ obj.

UPDATE:

Еще лучше, исходя из https://stackoverflow.com/a/48582282/8037, вы можете полностью исключить папку obj. Очевидно, что у задачи <AspNetCompiler /> нет параметра exclude, но если вы переключитесь на прямой вызов aspnet_compiler .exe, вы можете исключить obj следующим образом:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <Exec Command="$(MSBuildFrameworkToolsPath)aspnet_compiler.exe -v temp -p $(WebProjectOutputDir) -x $(BaseIntermediateOutputPath)"/>
</Target>
22 голосов
/ 19 января 2011

Когда вы получаете эту ошибку, у вас есть другой файл web.config в вашей папке obj? Если вы используете MSDeploy, это может помочь: http://blogs.msdn.com/b/webdevtools/archive/2010/05/14/the-aspnet-compiler-build-task-in-visual-studio-2010-asp-net-mvc-2-projects.aspx,, если нет, возможно, какой-то другой web.config генерируется каким-то инструментом, который вы используете.

3 голосов
/ 08 января 2014

Вот что у меня сработало. При желании вы можете указать условие в конфигурации.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
<Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'">
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>
0 голосов
/ 08 января 2019

Эта проблема проверки представления во время компиляции, даже если MvcBuildViews имеет значение true, хорошо объяснена в следующем блоге MSDN:

https://blogs.msdn.microsoft.com/jimlamb/2010/04/20/turn-on-compile-time-view-checking-for-asp-net-mvc-projects-in-tfs-build-2010/

Вы могли бы исправитьотредактировав .csproj файл напрямую:

<PropertyGroup>
   <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

 <Target Name="BuildViews" Condition="'$(MvcBuildViews)'=='true'" AfterTargets="Build">
   <Message Importance="normal" Text="Precompiling views" />
   <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
 </Target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...