問題は中間ファイルに関係していますが、ビューを構築する前にそれらの中間ファイルをクリーンアップすることからなる別の解決策があります。
このソリューションはVSの一部のバージョンに含まれていますが、VS 2013 Update 5で問題が発生したとしか言えません(以下の「注意」を参照してください。このバージョンで修正できますが、特定のバージョンでのみ機能するわけではありません。非標準の場合)。
Visual Studio Connectのアプリケーションレベルを超えて、エラー:allowDefinition='MachineToApplication'からソリューションを借用しました。
解決策は、これらの行をWebアプリケーションプロジェクト(.csproj
ファイル)に含めることで構成されます。このプロジェクトは、問題のある中間ファイルの削除を処理します。
<!--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>
注意:何らかの理由で、おそらくプロジェクトに自分で含めたため、ビューをビルドするためのビルドターゲットの名前が"BuildViews"
、ではなく、であったため、それに応じて属性"MvcBuildViews"
を変更する必要がありました。また、次のように、を削除して条件を単純化するBeforeTargets
ことにより、ターゲットを単純化しました。PropertyGroup
<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>