ASP.NET Core での Razor ファイルのコンパイル

Razor拡張機能を.cshtml持つファイルは、ビルド時と発行時の両方で SDK をRazor使用してコンパイルされます。 必要に応じて、プロジェクトを構成することでランタイム コンパイルを有効にすることができます。

Note

ランタイム コンパイルは、アプリのBlazorコンポーネントではRazorサポートされていません。

Razor のコンパイル

Razor ファイルのビルド時および発行時のコンパイルは、既定で Razor SDK によって有効になっています。 有効になっていると、実行時コンパイルはビルド時のコンパイルを補完し、編集された Razor ファイルを更新できます。

ビルド時のコンパイルに加えて、ビューとRazorページのRazor更新は、ASP.NET Coreの .NET ホット リロード サポートを使用してサポートされます。

Note

有効にすると、現在、ランタイム コンパイルによって .NET ホット リロードが無効になります。 ホット リロードを使用したランタイム コンパイルは、今後のリリースで予定されています。

すべての環境でランタイム コンパイルを有効にする

すべての環境でランタイム コンパイルを有効にするには:

  1. Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet パッケージをインストールします。

  2. 次の呼び出しでProgram.cs呼び出しますAddRazorRuntimeCompilation

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages()
        .AddRazorRuntimeCompilation();
    

条件付きでランタイム コンパイルを有効にする

ランタイム コンパイルは条件付きで有効にできます。これにより、発行された出力が確実に有効になります。

  • コンパイル済みのビューを使用する。
  • 運用環境のファイル監視を有効にしない。

開発環境に対してのみランタイム コンパイルを有効にするには:

  1. Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet パッケージをインストールします。

  2. 現在のProgram.cs環境が開発に設定されている場合に呼び出しますAddRazorRuntimeCompilation

    var builder = WebApplication.CreateBuilder(args);
    
    var mvcBuilder = builder.Services.AddRazorPages();
    
    if (builder.Environment.IsDevelopment())
    {
        mvcBuilder.AddRazorRuntimeCompilation();
    }
    

ランタイム コンパイルは、 ホスティング スタートアップ アセンブリを使用して有効にすることもできます。 特定の起動プロファイルに対して開発環境でランタイム コンパイルを有効にするには:

  1. Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet パッケージをインストールします。
  2. 次の中の起動プロファイルの environmentVariables セクションを launchSettings.json変更します。
    • ASPNETCORE_ENVIRONMENT"Development" に設定されていることを確認します。

    • ASPNETCORE_HOSTINGSTARTUPASSEMBLIES"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" に設定します。 たとえば、次launchSettings.jsonの例では、プロファイルとIIS Express起動プロファイルのランタイム コンパイルをViewCompilationSample有効にします。

      {
        "iisSettings": {
          "windowsAuthentication": false,
          "anonymousAuthentication": true,
          "iisExpress": {
            "applicationUrl": "http://localhost:7098",
            "sslPort": 44332
          }
        },
        "profiles": {
          "ViewCompilationSample": {
            "commandName": "Project",
            "dotnetRunMessages": true,
            "launchBrowser": true,
            "applicationUrl": "https://localhost:7173;http://localhost:5251",
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development",
              "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
            }
          },
          "IIS Express": {
            "commandName": "IISExpress",
            "launchBrowser": true,
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development",
              "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
            }
          }
        }
      }
      

この方法では、コードの変更は必要 Program.csありません。 実行時に、ASP.NET Core によって Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationアセンブリレベルの HostingStartup 属性が検索されます。 この属性は HostingStartup 、実行するアプリのスタートアップ コードを指定し、スタートアップ コードでランタイム コンパイルを有効にします。

Razor クラス ライブラリの実行時コンパイルを有効にする

Razor Pages プロジェクトが MyClassLib という名前の Razor クラス ライブラリ (RCL) を参照するシナリオについて考えてみます。 RCL には、 _Layout.cshtml MVC および Razor Pages プロジェクトで使用されるファイルが含まれています。 その RCL 内のファイルのランタイム コンパイルを _Layout.cshtml 有効にするには、Pages プロジェクトで次の変更を Razor 行います。

  1. 「ランタイム コンパイルを 条件付きで有効にする」の手順を使用して、ランタイム コンパイルを有効にします

  2. Program.csMvcRazorRuntimeCompilationOptions を構成します。

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages();
    
    builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
    {
        var libraryPath = Path.GetFullPath(
            Path.Combine(builder.Environment.ContentRootPath, "..", "MyClassLib"));
    
        options.FileProviders.Add(new PhysicalFileProvider(libraryPath));
    });
    

    上記のコードでは、 MyClassLib RCL への絶対パスがビルドされます。 PhysicalFileProvider API は、その絶対パスにあるディレクトリとファイルを検索するために使用されます。 最後に、RCL の PhysicalFileProvider ファイルへのアクセスを許可するファイル プロバイダー コレクションにインスタンスが .cshtml 追加されます。

その他のリソース

Razor拡張機能を.cshtml持つファイルは、ビルド時と発行時の両方で SDK をRazor使用してコンパイルされます。 実行時コンパイルは、プロジェクトを構成することで必要に応じて有効にできることがあります。

Razor のコンパイル

Razor ファイルのビルド時および発行時のコンパイルは、既定で Razor SDK によって有効になっています。 有効になっていると、実行時コンパイルはビルド時のコンパイルを補完し、編集された Razor ファイルを更新できます。

プロジェクト作成時に実行時コンパイルを有効にする

Razor Pages および MVC プロジェクト テンプレートには、プロジェクトの作成時に実行時コンパイルを有効にするオプションが含まれています。 このオプションは、ASP.NET Core 3.1 以降でのみサポートされます。

[新しい ASP.NET Core Web アプリケーションの作成] ダイアログで:

  1. Web アプリケーションまたは Web アプリケーション (Model-View-Controller) のいずれかのプロジェクト テンプレートを選択します。
  2. [Enable Razor runtime compilation]\(Razor の実行時コンパイルを有効にする\) チェックボックスをオンにします。

既存のプロジェクトで実行時コンパイルを有効にする

既存のプロジェクト内のすべての環境で実行時コンパイルを有効にするには:

  1. Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet パッケージをインストールします。

  2. プロジェクトの Startup.ConfigureServices メソッドを更新して、AddRazorRuntimeCompilation の呼び出しを含めます。 次に例を示します。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages()
            .AddRazorRuntimeCompilation();
    
        // code omitted for brevity
    }
    

既存のプロジェクトで実行時コンパイルを条件付きで有効にする

実行時コンパイルをローカル開発でのみ有効にできます。 このようにして条件付きで有効にすることにより、次のような出力が発行されるようにできます。

  • コンパイル済みのビューを使用する。
  • 運用環境のファイル監視を有効にしない。

開発環境でのみ実行時コンパイルを有効にするには:

  1. Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet パッケージをインストールします。
  2. 次の起動プロファイル environmentVariables セクションを launchSettings.json変更します。
    • ASPNETCORE_ENVIRONMENT"Development" に設定されていることを確認します。
    • ASPNETCORE_HOSTINGSTARTUPASSEMBLIES"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" に設定します。

次の例では、IIS Express および RazorPagesApp 起動プロファイルの開発環境で実行時コンパイルが有効になっています。

{
    "iisSettings": {
      "windowsAuthentication": false,
      "anonymousAuthentication": true,
      "iisExpress": {
        "applicationUrl": "http://localhost:57676",
        "sslPort": 44364
      }
    },
    "profiles": {
      "IIS Express": {
        "commandName": "IISExpress",
        "launchBrowser": true,
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development",
          "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
        }
      },
      "RazorPagesApp": {
        "commandName": "Project",
        "launchBrowser": true,
        "applicationUrl": "https://localhost:5001;http://localhost:5000",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development",
          "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
        }
      }
    }
  }

プロジェクトの Startup クラスでコードを変更する必要はありません。 実行時に、ASP.NET Core によって Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationアセンブリレベルの HostingStartup 属性が検索されます。 HostingStartup 属性は、実行するアプリのスタートアップ コードを指定します。 そのスタートアップ コードによって実行時コンパイルが可能になります。

Razor クラス ライブラリの実行時コンパイルを有効にする

Razor Pages プロジェクトが MyClassLib という名前の Razor クラス ライブラリ (RCL) を参照するシナリオについて考えてみます。 RCL には、 _Layout.cshtml チームのすべての MVC プロジェクトと Razor Pages プロジェクトが使用するファイルが含まれています。 その RCL 内のファイルのランタイム コンパイルを _Layout.cshtml 有効にする必要があります。 Razor Pages プロジェクトに、次の変更を加えます。

  1. 既存のプロジェクトで実行時コンパイルを条件付きで有効にする」の手順に従って、実行時コンパイルを有効にします。

  2. Startup.ConfigureServices で実行時コンパイル オプションを構成します。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    
        services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
        {
            var libraryPath = Path.GetFullPath(
                Path.Combine(HostEnvironment.ContentRootPath, "..", "MyClassLib"));
            options.FileProviders.Add(new PhysicalFileProvider(libraryPath));
        });
    }
    

    前のコードでは、MyClassLib RCL への絶対パスが構築されます。 PhysicalFileProvider API は、その絶対パスにあるディレクトリとファイルを検索するために使用されます。 最後に、RCL の PhysicalFileProvider ファイルへのアクセスを許可するファイル プロバイダー コレクションにインスタンスが .cshtml 追加されます。

その他のリソース