web-dev-qa-db-fra.com

MVCBuildViews ne fonctionne pas correctement

J'ai donc modifié mon fichier csproj sur une application MVC 3 RTM pour définir la propriété suivante:

<MvcBuildViews>true</MvcBuildViews>

Cela devrait entraîner le respect de mes vues pendant la construction et forcer une erreur de construction si ma vue est brisée. C'est le seul changement que j'ai apporté. Cependant, lorsque j'essaie de générer l'application, l'erreur suivante apparaît:

C'est une erreur d'utiliser une section enregistrée avec allowDefinition = 'MachineToApplication' au-delà du niveau de l'application. Cette erreur peut être provoquée par le fait qu'un répertoire virtuel n'est pas configuré en tant qu'application dans IIS.

Le projet se compile et s’exécute avec succès si je repasse à false,

Voici les tâches de génération configurées dans le fichier csproj (elles n'ont jamais été modifiées manuellement, elles ont été ajoutées par 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>

Est-ce que j'ai râté quelque chose? Comment configurer correctement MVC 3/Visual Studio 2010 pour valider mes vues au moment de la construction?

48
Scott

J'ai eu ce problème il y a quelques jours et je l'ai corrigé en supprimant le dossier obj/Debug. Nettoyer le projet fonctionne également. Je n'ai aucune idée de la cause du problème, cependant.

Voir Réponse de Joe Cartano pour une solution plus permanente.

53
Nick Canzoneri

Ce problème se produit lorsqu'il existe une sortie de projet Web (fichier web.config basé sur un modèle ou fichiers de publication temporaires) dans le dossier obj. Le compilateur ASP.NET utilisé n'est pas assez intelligent pour ignorer les éléments du dossier obj, il génère donc des erreurs.

Une autre solution consiste à analyser la sortie de publication juste avant d'appeler <AspNetCompiler>. Ouvrez votre .csproj et changez ceci:

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

pour ça:

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

Cela supprimera tous les web.configs sous\obj, ainsi que tous les dossiers PackageTmp sous\obj.

METTRE À JOUR:

Encore mieux, basé sur https://stackoverflow.com/a/48582282/8037 vous pouvez totalement exclure le dossier obj. Apparemment, la tâche <AspNetCompiler /> ne possède pas de paramètre d'exclusion, mais si vous appelez directement aspnet_compiler .exe, vous pouvez exclure obj de la manière suivante:

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

Lorsque vous obtenez cette erreur, avez-vous un autre fichier web.config dans votre dossier obj? Si vous utilisez MSDeploy, cela pourrait vous aider: 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 , si ce n'est pas le cas, peut-être qu'un autre web.config est généré par un outil que vous utilisez.

22
Joe Cartano

C'est ce qui a fonctionné pour moi. Vous pouvez éventuellement spécifier une condition avec la configuration.

<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

Ce numéro de la vérification d'affichage au moment de la compilation même si MvcBuildViews est défini sur 'true' est bien expliqué dans le blog MSDN suivant:

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

Vous pouvez faire le correctif en modifiant le fichier .csproj directement:

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