web-dev-qa-db-ja.com

MVCBuildViewsが正しく機能していません

そこで、MVC 3 RTM=アプリケーションでcsprojファイルを編集して、次のプロパティを設定しました。

<MvcBuildViews>true</MvcBuildViews>

これにより、ビルド中にビューがコンパイルされ、ビューが壊れている場合はビルドエラーが発生します。これは私が行った唯一の変更ですが、アプリケーションをビルドしようとすると、次のエラーが表示されます。

AllowDefinition = 'MachineToApplication'として登録されたセクションをアプリケーションレベルを超えて使用するとエラーになります。このエラーは、IISでアプリケーションとして設定されていない仮想ディレクトリが原因で発生する可能性があります。

プロジェクトをコンパイルして、falseに戻すと正常に実行されます。

以下は、csprojファイルで構成されたビルドタスクです(これらは手動で編集されることはなく、Visual Studio 2010によって追加されました)。

<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target> -->
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

ここに何かが足りませんか?ビルド時にビューを検証するためにMVC 3/Visual Studio 2010を正しく構成するにはどうすればよいですか?

48
Scott

数日前にこの問題が発生しました。obj/ Debugフォルダーを削除して修正しました。プロジェクトのクリーニングも機能します。ただし、問題の原因についてはわかりません。

より永続的な解決策については、 Joe Cartano's answer を参照してください。

54
Nick Canzoneri

この問題は、objフォルダーにWebプロジェクト出力(テンプレート化されたweb.configまたは一時公開ファイル)がある場合に発生します。使用されているASP.NETコンパイラは、objフォルダー内のものを無視するほどスマートではないため、代わりにエラーをスローします。

別の修正方法は、<AspNetCompiler>を呼び出す直前に発行出力を破棄することです。 .csprojを開き、これを変更します。

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

これに:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <ItemGroup>
    <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
    <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" />
  </ItemGroup>
  <Delete Files="@(ExtraWebConfigs)" />
  <RemoveDir Directories="@(ExtraPackageTmp)" />
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

これにより、\ objの下のすべてのweb.configと、\ objの下のすべてのPackageTmpフォルダーが削除されます。

UPDATE:

さらに良いことに基づいて https://stackoverflow.com/a/48582282/8037 objフォルダーを完全に除外できます。どうやら<AspNetCompiler />タスクにはexcludeパラメータはありませんが、aspnet_compiler .exeの直接呼び出しに切り替えると、次のようにobjを除外できます。

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <Exec Command="$(MSBuildFrameworkToolsPath)aspnet_compiler.exe -v temp -p $(WebProjectOutputDir) -x $(BaseIntermediateOutputPath)"/>
</Target>
37
Chris Hynes

このエラーが発生した場合、objフォルダーに別のweb.configファイルがありますか? MSDeployを使用している場合、これが役立つ場合があります。 http://blogs.msdn.com/b/webdevtools/archive/2010/05/14/the-aspnet-compiler-build-task-in-visual-studio -2010-asp-net-mvc-2-projects.aspx 、そうでない場合は、実行中のツールによって別のweb.configが生成されている可能性があります。

22
Joe Cartano

これは私のために働いたものです。オプションで、構成で条件を指定できます。

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
<Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'">
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>
3
arni

MvcBuildViewsが「true」に設定されている場合でも、コンパイル時のビューチェックに関するこの問題は、次のMSDNブログで詳しく説明されています。

https://blogs.msdn.Microsoft.com/jimlamb/2010/04/20/turn-on-compile-time-view-checking-for-asp-net-mvc-projects-in-tfs- build-2010 /

。csprojファイルを直接編集することで修正できます:

<PropertyGroup>
   <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

 <Target Name="BuildViews" Condition="'$(MvcBuildViews)'=='true'" AfterTargets="Build">
   <Message Importance="normal" Text="Precompiling views" />
   <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
 </Target>
0
Davood Rokni