web-dev-qa-db-ja.com

ASP.NET Core 2.0でビューをプリコンパイルする方法は?

記事 に従ってソリューションを設定しました。 this に従って、ASP.NET Core 2.0はデフォルトでビューをプリコンパイルするため、いくつかのことは省略しました。最後に、それをフォルダーに発行しますが、これは正常に終了しますが、precompiledviews.dllがありません。 .csprojで明示的に設定してみましたが、うまくいきませんでした。

編集:ソリューション内の両方のプロジェクトは、デフォルトのMVCテンプレートです。

10
Orvel

自己完結型の展開 、つまり、次のようなコマンドで公開する

dotnet publish-設定リリース--runtime win-x64

その結果、.NET Coreバイナリを含むすべての依存関係を含む実行可能ファイルになります。

Razorビューのコンパイルとプリコンパイル の記事には、次の警告が含まれています:

ASP.NET Core 2.0で自己完結型デプロイメント(SCD)を実行する場合、Razorビューのプリコンパイルは現在使用できません。この機能は、2.1リリース時にSCDで使用できるようになります。

したがって、プリコンパイルされたRazorビューを使用する場合は、 Framework-dependent deployment を使用する必要があります。つまり、次のコマンドでパブリッシュします。

dotnet publish-構成リリース

この場合、Razorビューは(デフォルトで)プリコンパイルされており、他のアプリケーションバイナリの中でYourAppName.PrecompiledViews.dllが見つかります。

[〜#〜] update [〜#〜](ライブラリプロジェクトのプリコンパイル済みビューの場合)

私の元の答えは通常のASP.NET Core MVCアプリケーションに関するものですが、質問はプリコンパイルされたビュー(自己完結型UI)を保持するプロジェクトライブラリに固有のものです。

ASP.NET Coreは、パブリッシュ時にデフォルトでビューをプリコンパイルしますが、これはライブラリプロジェクトに保存されているビューには当てはまりません。この問題に特化した githubの問題 があります。その議論はかなり長いですが、最終的には 結局 現時点では、Razorビューのプリコンパイル用のカスタムターゲットを含むソリューションを使用する必要があるという結論になります。基本的には、質問で参照されている article で説明されているのと同じアプローチです。

私はChildApplicationとメインMvcApplicationを使用してテストソリューションをセットアップし、ビルドとパブリッシュの両方で機能するプリコンパイル済みビューを作成しました。

ChildApplicationのc​​sprojは次のとおりです(デフォルトのASP.NET Core MVCプロジェクトのセクションをスキップします):

<PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
</PropertyGroup>

<!-- ... -->

<Target Name="SetMvcRazorOutputPath">
    <PropertyGroup>
        <MvcRazorOutputPath>$(OutputPath)</MvcRazorOutputPath>
    </PropertyGroup>
</Target>
<Target Name="_MvcRazorPrecompileOnBuild" DependsOnTargets="SetMvcRazorOutputPath;MvcRazorPrecompile" AfterTargets="Build" Condition=" '$(IsCrossTargetingBuild)' != 'true' " />
<Target Name="IncludePrecompiledViewsInPublishOutput" DependsOnTargets="_MvcRazorPrecompileOnBuild" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
    <ItemGroup>
        <_PrecompiledViewsOutput Include="$(MvcRazorOutputPath)$(MSBuildProjectName).PrecompiledViews.dll" />
        <_PrecompiledViewsOutput Include="$(MvcRazorOutputPath)$(MSBuildProjectName).PrecompiledViews.pdb" />
        <ContentWithTargetPath Include="@(_PrecompiledViewsOutput->'%(FullPath)')" RelativePath="%(_PrecompiledViewsOutput.Identity)" TargetPath="%(_PrecompiledViewsOutput.Filename)%(_PrecompiledViewsOutput.Extension)" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
</Target>

MvcApplicationのc​​sprojは次のとおりです。

<!-- ... -->

<ItemGroup>
    <ProjectReference Include="..\ChildApplication\ChildApplication.csproj" />
</ItemGroup>

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="xcopy &quot;$(ProjectDir)\..\ChildApplication\bin\$(ConfigurationName)\netcoreapp2.0\ChildApplication.PrecompiledViews.dll&quot; &quot;$(TargetDir)&quot; /Y /I" />
</Target>

<Target Name="AddPayloadsFolder" AfterTargets="Publish">
    <Exec Command="xcopy &quot;$(ProjectDir)\..\ChildApplication\bin\$(ConfigurationName)\netcoreapp2.0\ChildApplication.PrecompiledViews.dll&quot; &quot;$(PublishDir)&quot; /Y /I" />
</Target>

ディーンノース の元の記事 は、プリコンパイルされたビューでアセンブリへの直接参照を追加します。

<ItemGroup>
    <Reference Include="DashboardExample.PrecompiledViews">
        <HintPath>..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.PrecompiledViews.dll</HintPath>
    </Reference>
</ItemGroup>

このようなアプローチは、特定の構成でビルドされたアセンブリを使用するため、完璧ではありません(ここではDebug)。上記のプロジェクトファイルでは、ビルドと公開中にChildApplication.PrecompiledViews.dllをコピーする個別のターゲットを使用しています。

これは GitHubのサンプルソリューション で、親プロジェクトと子プロジェクトの両方があります。

10
CodeFuller

通常、これらを.csprojに追加します。ファイルをコピーする必要はありません。

    <PropertyGroup>
       <TargetFramework>netcoreapp2.2</...
       ...
       <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
       <PreserveCompilationContext>true</PreserveCompilationContext>
    </PropertyGroup>

    <ItemGroup>
        ...
       <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.2.0" />    
    </ItemGroup>
2
Serj Sagan