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

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

Note

ランタイム コンパイル:

Razor のコンパイル

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

アプリの実行中の開発中に Razor ビューと Razor Pages を更新することも、.NET ホット リロードを使用してサポートされます。

Note

有効にすると、ランタイム コンパイルによって .NET ホット リロードが無効になります。 開発中に Razor ランタイム コンパイルの代わりにホット リロードを使用することをお勧めします。

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

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

  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.csAddRazorRuntimeCompilation を呼び出します:

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

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

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

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

      {
        "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 には、MVC および Razor Pages プロジェクトによって使用される _Layout.cshtml ファイルが含まれています。 その RCL 内の _Layout.cshtml ファイルのランタイム コンパイルを有効にするには、Razor Pages プロジェクトで次の変更を行います:

  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 は、その絶対パスにあるディレクトリとファイルを検索するために使用されます。 最後に、PhysicalFileProvider インスタンスがファイル プロバイダー コレクションに追加されます。これにより、RCL の .cshtml ファイルにアクセスできるようになります。

その他のリソース

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

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. launchSettings.json で起動プロファイルの environmentVariables セクションを変更します。
    • 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 には、チームのすべての MVC および Razor Pages プロジェクトで使用される _Layout.cshtml ファイルが含まれています。 その 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 は、その絶対パスにあるディレクトリとファイルを検索するために使用されます。 最後に、PhysicalFileProvider インスタンスがファイル プロバイダー コレクションに追加されます。これにより、RCL の .cshtml ファイルにアクセスできるようになります。

その他のリソース