1. 程式人生 > 實用技巧 >ASP.NET Core Razor 檢視預編譯、動態編譯

ASP.NET Core Razor 檢視預編譯、動態編譯


0x01 前言

ASP.NET Core在預設釋出情況下,會啟動預編譯將試圖編譯成xx.Views.dll,也許在檢視中打算修改一處很細小的地方我們需要再重新編譯檢視進行釋出。下面我將從 ASP.NET Core 3 之前版本到 ASP.NET Core 3X 之後版本的一個配置列下下方供大家參考。

0x02 預編譯

在ASP.Core中預設是為我們啟動的預編譯,預設系統會將檢視編譯進行預編譯處理,最終會將編譯好的檢視生成一個DLL xx.Views.dll.

0x03 動態編譯

動態編譯也就是當我們檢視檔案發生變化時進行重新編譯和更新Razor檔案

ASP.NET Core 3之前版本:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>

通過上述程式碼只能幫我們做到在開發環境中進行動態編譯,那麼我們需要加上如下程式碼來實現我們生產環境中動態編譯.

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().AddRazorOptions(options =>
                options.AllowRecompilingViewsOnFileChange = true);
        }

條件:

  • MvcRazorCompileOnPublish
    :設定此選項false將關閉在釋出過程中啟用的檢視編譯的所有功能
  • MvcRazorExcludeViewFilesFromPublish:啟用MvcRazorCompileOnPublish可防止釋出.cshtml檔案。此選項禁用此行為。注意:ASP.NET Core Mvc不支援可更新的預編譯檢視。如果發現該路徑的預編譯檢視,則將忽略對已釋出的cshtml檔案的任何修改。
  • MvcRazorExcludeRefAssembliesFromPublish:啟用MvcRazorCompileOnPublish會使目標阻止refs釋出目錄。此選項禁用此行為。注意:如果您的應用程式使用了預編譯檢視和執行時編譯檢視的組合,則設定此選項很有用。
  • MvcRazorFilesToCompile:指定要編譯的檢視檔案。預設情況下,這包括標記為內容的所有.cshtml檔案。

ASP.NET Core 3.X版本:

安裝NuGet包

Install-Package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        .AddRazorRuntimeCompilation();
}
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
  </PropertyGroup>

通過上述程式碼我們可以在生產環境中也可以進行動態編譯,當然我們可以通過條件來限制.

基於環境和配置模式啟用執行時編譯:

  1. 根據活動的 Configuration 值,有條件地引用 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 包:
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.2" Condition="'$(Configuration)' == 'Debug'" />
  1. 更新專案的 Startup.ConfigureServices 方法以包含對 AddRazorRuntimeCompilation 的呼叫。 有條件地執行 AddRazorRuntimeCompilation,使其僅當 ASPNETCORE_ENVIRONMENT 變數設定為 Development時在除錯模式下執行:
public IWebHostEnvironment Env { get; set; }

public void ConfigureServices(IServiceCollection services)
{
    IMvcBuilder builder = services.AddRazorPages();

#if DEBUG
    if (Env.IsDevelopment())
    {
        builder.AddRazorRuntimeCompilation();
    }
#endif
}

Reference

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.1