104 votes

erreur allowDefinition='MachineToApplication' lors de la publication à partir de VS2010 (mais seulement après un build précédent)

Je peux exécuter mon application Asp.Net MVC 2 sans problème sur mon ordinateur local. Il suffit d'exécuter / déboguer.

Mais si je l'ai déjà construit, je ne peux pas le publier ! Je dois nettoyer la solution et la publier à nouveau. Je sais que ce n'est pas critique pour le système, mais c'est vraiment ennuyeux. "One Click Publish" n'est pas "Nettoyer la solution et ensuite One click publish".

L'erreur exacte est la suivante :

Erreur 11 C'est une erreur d'utiliser une enregistrée comme allowDefinition='MachineToApplication''. au-delà du niveau de l'application. Cette erreur peut être causée par un répertoire virtuel n'est pas configuré comme une application dans IIS.

Je soupçonne que cela a quelque chose à voir avec le Web.Config dans le dossier Views, mais alors pourquoi seulement après avoir construit une fois auparavant. Et juste pour noter, l'application fonctionne bien une fois publiée.

76voto

benpage Points 1500

J'ai eu le même problème avec mes applications MVC. C'était frustrant parce que je voulais toujours que mes vues soient vérifiées, et je ne voulais pas désactiver la fonction de vérification. MvcBuildViews

Heureusement, je suis tombé sur un poste ce qui m'a donné la réponse. gardez les MvcBuildViews en tant que vrai alors vous pouvez ajouter la ligne suivante en dessous dans votre fichier de projet :

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

Et faites en sorte que ce dossier ne soit pas dans le dossier de votre projet. Cela fonctionne pour moi. Ce n'est pas une solution parfaite, mais c'est bon pour le moment. Assurez-vous que vous supprimez le paquet (situé dans le dossier obj. \Debug et/ou obj. \Release ) de votre dossier de projet, sinon vous continuerez à obtenir l'erreur.

POUR INFO, MS est au courant de cette erreur ...

40voto

jimmay5469 Points 501

J'ai supprimé tout ce qui se trouvait dans mon dossier obj/Debug et cela a corrigé cette erreur. Cela m'a permis de laisser dans le

<MvcBuildViews>true</MvcBuildViews>

dans mon fichier de projet (ce qui est pratique avec le modèle T4MVC T4).

Modifier : Cela peut être réalisé beaucoup plus facilement en utilisant simplement le menu "Build" -> "Rebuild Solution" (parce que ce que rebuild fait réellement est de vider le dossier obj/Debug et ensuite de construire la solution).

26voto

jrummell Points 23718

J'utilise cette solution de contournement sur l' MS Connect pour cette erreur. Il nettoie tous les fichiers obj et temp sous votre projet (toutes les configurations) avant de lancer AspNetCompiler.

Modifiez la cible MvcBuildViews dans votre fichier de projet pour qu'il dépende des cibles qui nettoient les fichiers d'emballage que Visual Studio a créé. Ces cibles sont incluses dans projets d'application web automatiquement.

Tous les fichiers d'emballage seront supprimés chaque fois que la cible MvcBuildViews s'exécute.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" />
</Target>

24voto

Chris Hynes Points 5110

Ce problème se produit lorsqu'il y a des sorties de projet web (web.config modélisé ou fichiers de publication temporaires) dans le dossier obj. Le compilateur ASP.NET utilisé n'est pas assez intelligent pour ignorer le contenu du dossier obj, et génère donc des erreurs à la place.

Une autre solution consiste à supprimer la sortie de la 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>

à ç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 le nom de \obj.

4voto

Richard Szalay Points 42486

Si vous utilisez Web Publish, vous pouvez définir MvcBuildViews=false et PrecompileBeforePublish=true qui précompile après la copie dans le dossier temporaire (immédiatement avant de publier/emballer).

NOTE : PrecompileBeforePublish est uniquement pris en charge par la "nouvelle" pile de pipeline de publication sur le Web (VS2010 SP1 + Azure SDK ou VS2012 RTM). Si vous utilisez VS2010 RTM, vous devrez utiliser l'une des méthodes alternatives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X