El problema tiene que ver con los archivos intermedios, pero hay otra solución que consiste en limpiar esos archivos intermedios antes de construir las vistas.
Esta solución se ha incluido en alguna versión de VS, pero solo puedo decir que tuve el problema en VS 2013 Update 5. (Ver la sección "Cuidado" continuación, podría solucionarse en esta versión, pero no funciona solo en mi caso no estándar).
Tomé prestada la solución de Error: allowDefinition = 'MachineToApplication' más allá del nivel de aplicación en Visual Studio Connect.
La solución consiste en incluir estas líneas en el proyecto ( .csproj
archivo) de la aplicación web que gestiona el borrado de los archivos intermedios de salida:
<!--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 alguna razón, probablemente porque lo incluí yo mismo en el proyecto, mi objetivo de compilación para construir las vistas fue nombrado "BuildViews"
, en lugar de "MvcBuildViews"
, así que tuve que modificar el BeforeTargets
atributo en consecuencia. También simplifiqué el objetivo, eliminando PropertyGroup
y simplificando la condición, así:
<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>