webentwicklung-frage-antwort-db.com.de

MVCBuildViews funktionieren nicht ordnungsgemäß

Also habe ich meine csproj-Datei in einer MVC 3 RTM Anwendung bearbeitet, um die folgende Eigenschaft festzulegen:

<MvcBuildViews>true</MvcBuildViews>

Dies sollte dazu führen, dass meine Ansichten während des Builds eingehalten werden, und erzwingt einen Build-Fehler, wenn meine Ansicht beschädigt ist. Dies ist die einzige Änderung, die ich vorgenommen habe. Wenn ich jedoch versuche, die Anwendung zu erstellen, erhalte ich die folgende Fehlermeldung:

Es ist ein Fehler, einen Abschnitt zu verwenden, der als allowDefinition = 'MachineToApplication' außerhalb der Anwendungsebene registriert ist. Dieser Fehler kann durch ein virtuelles Verzeichnis verursacht werden, das nicht als Anwendung in IIS konfiguriert ist.

Das Projekt wird kompiliert und wird erfolgreich ausgeführt, wenn ich zurück zu false wechsle.

Im Folgenden werden die in der Datei csproj konfigurierten Build-Tasks aufgeführt (diese wurden nie manuell bearbeitet, sie wurden von Visual Studio 2010 hinzugefügt).

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

Fehlt mir hier etwas? Wie kann ich MVC 3/Visual Studio 2010 richtig konfigurieren, um meine Ansichten während der Erstellung zu überprüfen?

48
Scott

Ich hatte dieses Problem vor ein paar Tagen und es wurde behoben, indem der obj/Debug-Ordner gelöscht wurde. Die Reinigung des Projekts funktioniert auch. Ich habe jedoch keine Ahnung von der Ursache des Problems.

Siehe Joe Cartanos Antwort für eine dauerhaftere Lösung.

53
Nick Canzoneri

Dieses Problem tritt auf, wenn sich im Obj-Ordner Webprojektausgabe (Templates web.config oder temporäre Veröffentlichungsdateien) befindet. Der verwendete ASP.NET-Compiler ist nicht intelligent genug, um Objekte im Ordner obj zu ignorieren, sodass er stattdessen Fehler ausgibt.

Ein weiterer Fix ist, die Publish-Ausgabe kurz vor dem Aufruf von <AspNetCompiler> zu nuke. Öffne dein .csproj und ändere das:

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

zu diesem:

<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>

Dadurch werden alle web.configs unter\obj sowie alle PackageTmp-Ordner unter\obj gelöscht.

UPDATE:

Noch besser, basierend auf https://stackoverflow.com/a/48582282/8037 können Sie den obj-Ordner vollständig ausschließen. Anscheinend hat die <AspNetCompiler />-Task keinen ausschließenden Parameter. Wenn Sie jedoch zum direkten Aufruf der aspnet_compiler .exe wechseln, können Sie obj wie folgt ausschließen:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <Exec Command="$(MSBuildFrameworkToolsPath)aspnet_compiler.exe -v temp -p $(WebProjectOutputDir) -x $(BaseIntermediateOutputPath)"/>
</Target>
37
Chris Hynes

Wenn Sie diesen Fehler erhalten, haben Sie eine weitere Datei web.config in Ihrem obj-Ordner? Wenn Sie MSDeploy verwenden, kann dies hilfreich sein: 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 Wenn nicht, wird möglicherweise eine andere web.config von einem Tool generiert, das Sie ausführen.

22
Joe Cartano

Das hat bei mir funktioniert. Optional können Sie in der Konfiguration eine Bedingung angeben.

<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

Diese Ausgabe der Compile-Time View-Prüfung, obwohl MvcBuildViews auf 'true' gesetzt ist, wird im folgenden MSDN-Blog ausführlich beschrieben:

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

Sie können das Problem beheben, indem Sie die Datei .csproj direkt bearbeiten:

<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.