다음을 통해 공유


dotnet watch

이 문서의 적용 대상: ✔️ .NET Core 3.1 SDK 이상 버전

이름

dotnet watch - 소스 코드의 변경 내용이 검색되면 지정된 애플리케이션을 다시 시작하거나, 핫 다시 로드하거나, 지정된 dotnet 명령을 실행합니다.

개요

dotnet watch [<command>]
  [--list]
  [--no-hot-reload] [--non-interactive]
  [--project <PROJECT>]
  [-q|--quiet] [-v|--verbose]
  [--version]
  [--] <forwarded arguments> 

dotnet watch -?|-h|--help

설명

dotnet watch 명령은 파일 감시자입니다. 변경 내용이 검색되면 dotnet run 명령 또는 지정된 dotnet 명령을 실행합니다. dotnet run을 실행하고 변경 내용이 핫 다시 로드에 지원되는 경우 지정된 애플리케이션을 핫 다시 로드합니다. 변경 내용이 지원되지 않으면 애플리케이션이 다시 시작됩니다. 이 프로세스를 통해 명령줄에서 빠른 반복 개발이 가능해졌습니다.

dotnet watch를 실행하는 동안 명령 셸에서 Ctrl+R을 눌러 앱을 강제로 다시 빌드하고 다시 시작할 수 있습니다. 해당 기능은 앱이 실행되는 동안에만 사용할 수 있습니다. 예를 들어, Ctrl+R을 누르기 전에 종료되는 콘솔 앱에서 dotnet watch를 실행하는 경우 Ctrl+R을 눌러도 아무런 효과가 없습니다. 그러나 이 경우 dotnet watch는 계속 파일을 감시하고 있으며 파일이 업데이트되면 앱을 다시 시작합니다.

응답 압축

응답 압축을 사용하는 앱에 대해 dotnet watch가 실행되는 경우 도구는 브라우저 새로 고침 스크립트를 삽입할 수 없습니다. .NET 7 이상 버전의 도구에서는 다음과 같은 경고 메시지를 표시합니다.

경고: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware[4]

응답에 브라우저 새로 고침 스크립트 주입을 구성할 수 없습니다. 이는 응답의 Content-Encoding: 'br'로 인해 발생했을 수 있습니다. 응답 압축을 사용하지 않도록 설정하는 것이 좋습니다.

응답 압축을 사용하지 않도록 설정하는 대신 앱 페이지에 브라우저 새로 고침 JavaScript 참조를 수동으로 추가합니다.

@if (Environment.GetEnvironmentVariable("__ASPNETCORE_BROWSER_TOOLS") is not null)
{
    <script src="/_framework/aspnetcore-browser-refresh.js"></script>
}

인수

  • <command>

    .NET 7 SDK 및 이전 dotnet watch 버전에서는 기본 제공 CLI 명령 및 전역 도구와 같이 실행 파일을 통해 dotnet 디스패치되는 모든 명령을 실행할 수 있습니다. dotnet <command>를 실행할 수 있으면 dotnet watch <command>를 실행할 수 있습니다.

    .NET 8 SDK 이상 dotnet watch 에서 실행dotnet rundotnet build하거나 dotnet test실행할 수 있습니다. 또는 에 buildtest 대해 <command>지정run합니다.

    자식 명령이 지정되지 않은 경우 기본값은 dotnet run의 경우 run입니다.

  • <forwarded arguments>

    이중 대시(--) 뒤에 제공된 인수는 자식 dotnet 프로세스에 전달됩니다. dotnet watch run을 실행 중인 경우 이러한 인수는 dotnet run에 대한 옵션입니다. dotnet watch test를 실행 중인 경우 이러한 인수는 dotnet test에 대한 옵션입니다.

옵션

  • --list

    감시자를 시작하지 않고 발견된 모든 파일을 나열합니다.

  • --no-hot-reload

    지원되는 앱에 대해 핫 다시 로드를 표시하지 않습니다.

  • --non-interactive

    비대화형 모드에서 dotnet watch를 실행합니다. 콘솔 입력이 요청되지 않도록 하려면 이 옵션을 사용합니다. 핫 다시 로드가 사용하도록 설정되고 편집 다시 실행이 감지되면 dotnet watch가 앱을 다시 시작합니다. .NET 7 SDK부터 사용할 수 있습니다.

  • --project <PATH>

    실행할 프로젝트 파일의 경로를 지정합니다(폴더만 또는 프로젝트 파일 이름 포함). 지정하지 않으면 현재 디렉터리로 기본 설정됩니다.

  • -q|--quiet

    경고 및 오류를 제외하고 dotnet watch 명령으로 생성된 모든 출력을 표시하지 않습니다. 옵션은 자식 명령으로 전달되지 않습니다. 예를 들어, dotnet restoredotnet run의 출력은 계속해서 출력됩니다.

  • -v|--verbose

    디버깅을 위한 자세한 출력을 표시합니다.

  • --version

    dotnet watch의 버전을 표시합니다.

  • --

    이중 대시 옵션('--')을 사용하면 자식 프로세스에 전달될 인수에서 dotnet watch 옵션을 구분할 수 있습니다. 사용은 선택 사항입니다. 이중 대시 옵션이 사용되지 않으면 dotnet watch는 인식할 수 없는 첫 번째 인수를 자식 dotnet 프로세스에 전달해야 하는 인수의 시작으로 간주합니다.

환경 변수

dotnet watch는 다음 환경 변수를 사용합니다.

  • DOTNET_HOTRELOAD_NAMEDPIPE_NAME

    이 값은 앱이 시작될 때 dotnet watch에 의해 구성되며 명명된 파이프를 지정합니다.

  • DOTNET_USE_POLLING_FILE_WATCHER

    1 또는 true로 설정되면 dotnet watchSystem.IO.FileSystemWatcher 대신 폴링 파일 감시자를 사용합니다. 네트워크 공유, Docker 탑재 볼륨, 기타 가상 파일 시스템과 같은 일부 파일 시스템에는 폴링이 필요합니다. PhysicalFileProvider 클래스는 DOTNET_USE_POLLING_FILE_WATCHER를 사용하여 PhysicalFileProvider.Watch 메서드가 PollingFileChangeToken에 의존하는지 여부를 알아냅니다.

  • DOTNET_WATCH

    dotnet watch는 시작되는 모든 자식 프로세스에서 이 변수를 1로 설정합니다.

  • DOTNET_WATCH_AUTO_RELOAD_WS_HOSTNAME

    dotnet watch의 일환으로 브라우저 새로 고침 서버 메커니즘은 이 값을 읽고 WebSocket 호스트 환경을 알아냅니다. 127.0.0.1 값은 localhost로 대체되고 http://https:// 스키마는 각각 ws://wss://로 대체됩니다.

  • DOTNET_WATCH_ITERATION

    dotnet watch는 이 변수를 1로 설정하고 파일이 변경될 때마다 1씩 증가하며 명령이 애플리케이션을 다시 시작하거나 핫 다시 로드합니다.

  • DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH

    1 또는 true로 설정된 경우, dotnet watch는 파일 변경 내용을 검색할 때 브라우저를 새로 고치지 않습니다.

  • DOTNET_WATCH_SUPPRESS_EMOJIS

    .NET SDK 6.0.300 이상에서는 다음 예와 같이 dotnet watch가 ASCII가 아닌 문자를 콘솔에 내보냅니다.

    dotnet watch 🔥 Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload.
      💡 Press "Ctrl + R" to restart.
    dotnet watch 🔧 Building...
    dotnet watch 🚀 Started
    dotnet watch ⌚ Exited
    dotnet watch ⏳ Waiting for a file to change before restarting dotnet...
    

    특정 콘솔 호스트에서는 이러한 문자가 왜곡되어 나타날 수 있습니다. 잘못된 문자가 표시되는 것을 방지하려면 이 변수를 1 또는 true로 설정합니다.

  • DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER

    1 또는 true로 설정된 경우, dotnet watchlaunchSettings.json에 구성된 launchBrowser가 있는 웹앱용 브라우저를 시작하거나 새로 고치지 않습니다.

  • DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM

    기본적으로 dotnet watch는 파일이 변경될 때마다 복원 실행이나 감시된 파일 집합 다시 평가와 같은 특정 작업이 수행되지 않도록 하여 빌드를 최적화합니다. 이 변수가 1 또는 true로 설정되면 이러한 최적화가 사용하지 않도록 설정됩니다.

  • DOTNET_WATCH_SUPPRESS_STATIC_FILE_HANDLING

    1 또는 true로 설정하면 dotnet watch는 정적 콘텐츠 파일에 대해 특별한 처리를 수행하지 않습니다. dotnet watch는 MSBuild 속성 DotNetWatchContentFilesfalse로 설정합니다.

  • DOTNET_WATCH_RESTART_ON_RUDE_EDIT

    1 또는 true로 설정하면 dotnet watch는 요청하는 대신 편집 다시 실행 시 항상 다시 시작됩니다.

기본적으로 감시되는 파일

dotnet watch는 프로젝트 파일의 Watch 항목 그룹에 있는 모든 항목을 감시합니다. 기본적으로 이 그룹에는 CompileEmbeddedResource 그룹의 모든 항목이 포함됩니다. dotnet watch는 또한 프로젝트 참조의 전체 그래프를 검사하고 해당 프로젝트 내의 모든 파일을 감시합니다.

기본적으로 CompileEmbeddedResource 그룹에는 다음 GLOB 패턴과 일치하는 모든 파일이 포함됩니다.

  • **/*.cs
  • *.csproj
  • **/*.resx
  • 웹앱의 콘텐츠 파일: wwwroot/**

구성 시스템에는 구성 변경을 처리하기 위한 자체 메커니즘이 있으므로 .config.json 파일은 기본적으로 dotnet watch 다시 시작을 트리거하지 않습니다.

프로젝트 파일을 편집하여 관심 목록에 파일을 추가하거나 목록에서 제거할 수 있습니다. 파일은 개별적으로 지정하거나 GLOB 패턴을 사용하여 지정할 수 있습니다.

추가 파일 보기

Watch 그룹에 항목을 추가하면 더 많은 파일을 볼 수 있습니다. 예를 들어, 다음 태그는 JavaScript 파일을 포함하도록 해당 그룹을 확장합니다.

<ItemGroup>
  <Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>

지정된 파일 무시

다음 예에 표시된 것처럼 dotnet watchWatch="false" 특성이 있는 CompileEmbeddedResource 항목을 무시합니다.

<ItemGroup>
  <Compile Update="Generated.cs" Watch="false" />
  <EmbeddedResource Update="Strings.resx" Watch="false" />
</ItemGroup>

다음 예에 표시된 것처럼 dotnet watchWatch="false" 특성이 있는 프로젝트 참조를 무시합니다.

<ItemGroup>
  <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>

고급 구성

dotnet watch는 볼 항목을 찾기 위해 디자인 타임 빌드를 수행합니다. 이 빌드가 실행되면 dotnet watchDotNetWatchBuild=true 속성을 설정합니다. 이 속성은 다음 예와 같이 사용할 수 있습니다.

<ItemGroup Condition="'$(DotNetWatchBuild)'=='true'">
  <!-- only included in the project when dotnet-watch is running -->
</ItemGroup>

핫 다시 로드

.NET 6부터 dotnet watch에는 핫 다시 로드에 대한 지원이 포함됩니다. 핫 다시 로드는 다시 빌드하고 다시 시작할 필요 없이 실행 중인 앱에 변경 내용을 적용할 수 있는 기능입니다. 변경 내용은 코드 파일이나 스타일시트 파일 및 JavaScript 파일과 같은 정적 자산에 대한 것일 수 있습니다. 이 기능은 앱을 수정할 때 즉각적인 피드백을 제공하므로 로컬 개발 환경을 간소화합니다.

핫 다시 로드를 지원하는 앱 형식 및 .NET 버전에 대한 자세한 내용은 지원되는 .NET 앱 프레임워크 및 시나리오를 참조하세요.

편집 다시 실행

파일이 수정되면 dotnet watch는 앱을 핫 다시 로드할 수 있는지 확인합니다. 핫 다시 로드할 수 없는 경우 변경 내용을 편집 다시 실행이라고 하며 dotnet watch는 앱을 다시 시작할 것인지 묻습니다.

dotnet watch ⌚ Unable to apply hot reload because of a rude edit.
  ❔ Do you want to restart your app - Yes (y) / No (n) / Always (a) / Never (v)?
  • : 앱을 다시 시작합니다.
  • 아니요: 변경 내용을 적용하지 않고 앱을 계속 실행합니다.
  • 항상: 앱을 다시 시작하고 편집 다시 실행에 대한 메시지를 더 이상 표시하지 않습니다.
  • 안함: 변경 내용을 적용하지 않고 앱을 계속 실행하며 편집 다시 실행에 대한 메시지를 더 이상 표시하지 않습니다.

편집 다시 실행으로 간주되는 변경 내용에 대한 자세한 내용은 코드 편집 및 디버깅 계속지원되지 않는 코드 변경을 참조하세요.

dotnet watch를 실행할 때 핫 다시 로드를 사용하지 않도록 설정하려면 다음 예와 같이 --no-hot-reload 옵션을 사용합니다.

dotnet watch --no-hot-reload 

예제

  • 소스 코드가 변경될 때마다 현재 디렉터리의 프로젝트에 대해 dotnet run을 실행합니다.

    dotnet watch
    

    또는

    dotnet watch run
    
  • 소스 코드가 변경될 때마다 현재 디렉터리의 프로젝트에 대해 dotnet test를 실행합니다.

    dotnet watch test
    
  • 소스 코드가 변경될 때마다 dotnet run --project ./HelloWorld.csproj를 실행합니다.

    dotnet watch run --project  ./HelloWorld.csproj
    
  • 소스 코드가 변경될 때마다 현재 디렉터리의 프로젝트에 대해 dotnet run -- arg0을 실행합니다.

    dotnet watch run -- arg0
    

    또는

    dotnet watch -- run arg0
    

참고 항목