O problema tem a ver com os arquivos intermediários, mas existe outra solução que consiste em limpar esses arquivos intermediários antes de construir as visualizações.
Esta solução foi incluída em alguma versão do VS, mas só posso dizer que tive o problema no VS 2013 Atualização 5. (Veja a seção "Cuidado" abaixo, poderia ser corrigido nesta versão, mas não funcionando apenas no meu particular caso não padrão).
Peguei emprestada a solução de Error: allowDefinition = 'MachineToApplication' além do nível do aplicativo no Visual Studio Connect.
A solução consiste em incluir estas linhas no projeto de aplicação web ( .csproj
arquivo) que tratam da deleção dos arquivos intermediários offedning:
<!--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>
Cuidado: por algum motivo, provavelmente porque eu mesmo o incluí no projeto, meu destino de construção para construir as visualizações foi nomeado "BuildViews"
, em vez de "MvcBuildViews"
, então eu tive que modificar o BeforeTargets
atributo de acordo. Também simplifiquei o alvo, removendo o PropertyGroup
e simplificando a condição, assim:
<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>