ASP.NET Core의 Razor 파일 컴파일

Razor확장이 있는 .cshtml 파일은 SDK를 사용하여 Razor 빌드 및 게시 시간 모두에서 컴파일됩니다. 프로젝트를 구성하여 런타임 컴파일을 선택적으로 활성화할 수 있습니다.

참고 항목

런타임 컴파일:

  • Blazor 앱의 Razor 구성 요소에는 지원되지 않습니다.
  • 전역 using 지시문을 지원하지 않습니다.
  • 암시적 using 지시문을 지원하지 않습니다.
  • .NET 핫 다시 로드 사용하지 않도록 설정합니다.
  • 프로덕션이 아닌 개발에 권장됩니다.

Razor 컴파일

Razor 파일의 빌드 및 게시 시 컴파일은 Razor SDK에 의해 기본적으로 활성화됩니다. 사용하도록 설정하면 런타임 컴파일은 빌드 시간 컴파일을 보완하여 Razor 앱이 실행되는 동안 파일을 편집하는 경우 파일을 업데이트할 수 있도록 합니다.

앱이 실행되는 동안 개발 중에 보기 및 Razor Pages를 업데이트 Razor 하는 것도 .NET 핫 다시 로드 사용하여 지원됩니다.

참고 항목

사용하도록 설정하면 런타임 컴파일에서 .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. 현재 환경이 개발로 설정된 경우 AddRazorRuntimeCompilation에서 Program.cs를 호출합니다.

    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.jsonViewCompilationSampleIIS 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.cs에서 MvcRazorRuntimeCompilationOptions 구성:

    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 파일에 액세스할 수 있도록 하는 파일 공급자 컬렉션에 추가됩니다.

추가 리소스

Razor확장이 있는 .cshtml 파일은 SDK를 사용하여 Razor 빌드 및 게시 시간 모두에서 컴파일됩니다. 프로젝트를 구성하여 런타임 컴파일을 선택적으로 활성화할 수 있습니다.

Razor 컴파일

Razor 파일의 빌드 및 게시 시 컴파일은 Razor SDK에 의해 기본적으로 활성화됩니다. 런타임 컴파일이 활성화되면 Razor 파일이 편집될 경우 해당 파일이 갱신될 수 있도록 빌드 시 컴파일을 보완합니다.

프로젝트를 만들 때 런타임 컴파일 사용

Razor Pages 및 MVC 프로젝트 템플릿에는 프로젝트를 만들 때 런타임 컴파일을 사용하도록 설정하는 옵션이 포함되어 있습니다. 이 옵션은 ASP.NET Core 3.1 이상에서만 지원됩니다.

새 ASP.NET Core 웹 애플리케이션 만들기 대화 상자에서 다음을 수행합니다.

  1. 웹 애플리케이션 또는 웹 애플리케이션(Model-View-Controller) 프로젝트 템플릿을 선택합니다.
  2. Razor 런타임 컴파일 사용 확인란을 선택합니다.

기존 프로젝트에서 런타임 컴파일 사용

기존 프로젝트의 모든 환경에 런타임 컴파일을 사용하도록 설정하려면 다음을 수행합니다.

  1. Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 패키지를 설치합니다.

  2. AddRazorRuntimeCompilation에 대한 호출을 포함하도록 프로젝트의 Startup.ConfigureServices 메서드를 업데이트합니다. 예시:

    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 ExpressRazorPagesApp 시작 프로필에 대한 개발 환경에서 런타임 컴파일이 사용하도록 설정됩니다.

{
    "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는 절대 경로에서 디렉터리와 파일을 찾는 데 사용됩니다. 마지막으로 인스턴스가 PhysicalFileProvider RCL의 .cshtml 파일에 액세스할 수 있도록 하는 파일 공급자 컬렉션에 추가됩니다.

추가 리소스