it-roy-ru.com

MVCBuildViews не работает правильно

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

<MvcBuildViews>true</MvcBuildViews>

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

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

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

Ниже приведены задачи сборки, настроенные в файле 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 для проверки моих представлений во время сборки?

48
Scott

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

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

53
Nick Canzoneri

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

Еще одно исправление - обнулить вывод публикации прямо перед вызовом <AspNetCompiler>. Откройте ваш .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.

Обновление:

Еще лучше, основываясь на 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>
37
Chris Hynes

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

22
Joe Cartano

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

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
<Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'">
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>
3
arni

Эта проблема проверки представления во время компиляции, даже если 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>
0
Davood R.