Problem dotyczy plików pośrednich, ale istnieje inne rozwiązanie polegające na wyczyszczeniu tych plików pośrednich przed zbudowaniem widoków.
To rozwiązanie zostało zawarte w niektórych wersjach VS, ale mogę tylko powiedzieć, że miałem problem w VS 2013 Update 5. (Zobacz "Uwaga" poniżej, można to naprawić w tej wersji, ale nie działa tylko w moim przypadek niestandardowy).
Rozwiązanie pożyczyłem od Error: allowDefinition = 'MachineToApplication' poza poziomem aplikacji w Visual Studio Connect.
Rozwiązanie polega .csproj
na dołączeniu tych wierszy do projektu ( pliku) aplikacji internetowej, które obsługują usuwanie gotowych plików pośrednich:
<!--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>
Uwaga: z jakiegoś powodu, prawdopodobnie dlatego, że włączyłem go sam do projektu, mój cel kompilacji do budowania widoków został nazwany "BuildViews"
zamiast "MvcBuildViews"
, więc musiałem odpowiednio zmodyfikować BeforeTargets
atrybut. Uprościłem też cel, usuwając PropertyGroup
i upraszczając warunek, na przykład:
<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>