Le problème concerne les fichiers intermédiaires, mais il existe une autre solution qui consiste à nettoyer ces fichiers intermédiaires avant de construire les vues.
Cette solution a été incluse dans certaines versions de VS, mais je peux seulement dire que j'ai eu le problème dans VS 2013 Update 5. (Voir le "Attention" ci-dessous, il pourrait être corrigé dans cette version, mais ne fonctionne pas uniquement dans mon cas particulier cas non standard).
J'ai emprunté la solution à Error: allowDefinition = 'MachineToApplication' au-delà du niveau de l'application sur Visual Studio Connect.
La solution consiste à inclure ces lignes dans le projet d'application web ( .csproj
fichier) qui gère la suppression des fichiers intermédiaires proposés:
<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level,
we will need to clean up our temp folder before MVC project starts the pre-compile-->
<PropertyGroup>
<_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
</PropertyGroup>
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
<ItemGroup>
<_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
</ItemGroup>
<!--Force msbuild to expand all the wildcard characters so to get real file paths-->
<CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
<Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
</CreateItem>
<Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>
Attention: pour une raison quelconque, probablement parce que je l'ai inclus moi-même dans le projet, ma cible de construction pour construire les vues a été nommée "BuildViews"
, au lieu de "MvcBuildViews"
, donc j'ai dû modifier l' BeforeTargets
attribut en conséquence. J'ai également simplifié la cible, en supprimant PropertyGroup
et en simplifiant la condition, comme ceci:
<Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews">
<ItemGroup>
<_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
</ItemGroup>
<!--Force msbuild to expand all the wildcard characters so to get real file paths-->
<CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
<Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
</CreateItem>
<Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>