Il problema ha a che fare con i file intermedi, ma esiste un'altra soluzione che consiste nel ripulire quei file intermedi prima di compilare le viste.
Questa soluzione è stata inclusa in alcune versioni di VS, ma posso solo dire che ho avuto il problema in VS 2013 Update 5. (Vedi la sezione "Attenzione" di seguito, potrebbe essere risolto in questa versione, ma non funziona solo nel mio particolare caso non standard).
Ho preso in prestito la soluzione da Error: allowDefinition = 'MachineToApplication' oltre il livello dell'applicazione su Visual Studio Connect.
La soluzione consiste nell'includere queste righe al progetto dell'applicazione web ( .csproj
file) che gestisce la cancellazione dei file intermedi in arrivo:
<!--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>
Attenzione: per qualche motivo, probabilmente perché l'ho incluso io stesso nel progetto, il mio obiettivo di compilazione per la creazione delle viste è stato nominato "BuildViews"
, invece di "MvcBuildViews"
, quindi ho dovuto modificare l' BeforeTargets
attributo di conseguenza. Ho anche semplificato il target, rimuovendo PropertyGroup
e semplificando la condizione, in questo modo:
<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>