dotnet watch
Эта статья относится к: ✔️ пакету SDK для .NET Core 3.1 и более поздних версий
Имя.
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
Description
Команда dotnet watch
— это наблюдатель за файлами. При обнаружении изменения выполняется dotnet run
команда или указанная dotnet
команда. Если оно выполняется dotnet run
, а изменение поддерживается для горячей перезагрузки, оно перезагрузит указанное приложение. Если изменение не поддерживается, он перезапускает приложение. Этот процесс обеспечивает быструю итеративную разработку из командной строки.
Во время выполнения dotnet watch
можно принудительно перестроить и перезапустить приложение, нажав клавиши CTRL+R в командной оболочке. Эта функция доступна только во время работы приложения. Например, если вы запускаете dotnet watch
консольное приложение, которое заканчивается перед нажатием клавиш CTRL+R, нажатие клавиш CTRL+R не влияет. Однако в этом случае dotnet watch
все еще просматривает файлы и перезапустит приложение, если файл обновлен.
Сжатие ответов
Если dotnet watch
выполняется для приложения, использующего сжатие ответов, средство не может внедрить скрипт обновления браузера. В .NET 7 и более поздней версии средства отображается предупреждение, как показано ниже:
warn: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware[4]
Не удается настроить внедрение скрипта обновления браузера в ответе. Это может быть вызвано кодировкой содержимого ответа: br. Рассмотрите возможность отключения сжатия ответов.
В качестве альтернативы отключению сжатия ответов вручную добавьте ссылку на JavaScript на страницы приложения:
@if (Environment.GetEnvironmentVariable("__ASPNETCORE_BROWSER_TOOLS") is not null)
{
<script src="/_framework/aspnetcore-browser-refresh.js"></script>
}
Аргументы
<command>
В пакете SDK для .NET 7 и более ранних
dotnet watch
версий можно выполнить любую команду, которая отправляется через исполняемыйdotnet
файл, например встроенные команды CLI и глобальные средства. Если вы можете запуститьdotnet <command>
, можно запуститьdotnet watch <command>
.В пакете SDK для .NET 8 и более поздних
dotnet watch
версий может выполнятьсяdotnet run
илиdotnet build
dotnet test
. Укажитеrun
,build
илиtest
для<command>
.Если дочерняя команда не указана, используется
run
dotnet run
значение по умолчанию.<forwarded arguments>
Аргументы, предоставленные после двойного дефиса (
--
) передаются дочернемуdotnet
процессу. Если вы работаетеdotnet watch run
, эти аргументы являются вариантами выполнения dotnet. Если вы работаетеdotnet watch test
, эти аргументы являются вариантами для dotnet test.
Параметры
--list
Выводит список всех обнаруженных файлов без запуска наблюдателя.
--no-hot-reload
Отключение горячей перезагрузки для поддерживаемых приложений.
--non-interactive
Выполняется
dotnet watch
в неинтерактивном режиме. Используйте этот параметр, чтобы запретить запрашивать входные данные консоли. Если включена горячая перезагрузка и обнаружена грубое изменение , dotnet watch перезапускает приложение. Доступно с пакета SDK для .NET 7.--project <PATH>
Указывает путь к файлу проекта для запуска (только папка или имя файла проекта). Если значение не задано, по умолчанию используется текущий каталог.
-q|--quiet
Подавляет все выходные данные, созданные командой
dotnet watch
, за исключением предупреждений и ошибок. Параметр не передается дочерним командам. Например, выходные данные изdotnet restore
иdotnet run
дальше будут выводиться.-v|--verbose
Отображает подробные выходные данные для отладки.
--version
Показывает версию
dotnet watch
.--
Параметр double-dash ('--) можно использовать для разделителя
dotnet watch
параметров от аргументов, которые будут переданы дочернему процессу. Его использование является необязательным. Если параметр двойного дефиса не используется,dotnet watch
считает первый нераспознанный аргумент началом аргументов, которые он должен передать в дочернийdotnet
процесс.
Переменные среды
dotnet watch
использует следующие переменные среды:
DOTNET_HOTRELOAD_NAMEDPIPE_NAME
Это значение настраивается
dotnet watch
при запуске приложения и указывает именованный канал.DOTNET_USE_POLLING_FILE_WATCHER
Если задано
1
значение илиtrue
используетсяdotnet watch
наблюдатель за файлами опроса, а не System.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
и увеличивается по одному при каждом изменении файла, а команда перезапускает или перезагружает приложение.DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH
Если задано
1
значение илиtrue
неdotnet watch
обновляет браузеры при обнаружении изменений файлов.DOTNET_WATCH_SUPPRESS_EMOJIS
При использовании пакета SDK для .NET версии 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 watch
будет запускать или обновлять браузеры для веб-приложений,launchBrowser
настроенных в launchSettings.json.DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM
По умолчанию оптимизирует сборку,
dotnet watch
избегая определенных операций, таких как выполнение восстановления или повторное вычисление набора отслеживаемых файлов при каждом изменении файла. Если эта переменная задана1
илиtrue
отключена, эти оптимизации отключены.DOTNET_WATCH_SUPPRESS_STATIC_FILE_HANDLING
Если задано
1
значение илиtrue
неdotnet watch
будет выполнять специальную обработку статических файлов содержимого.dotnet watch
задает для свойства MSBuild значениеDotNetWatchContentFiles
false
.DOTNET_WATCH_RESTART_ON_RUDE_EDIT
Если задано
1
значение илиtrue
,dotnet watch
всегда перезапускается при грубых изменениях вместо запроса.
Файлы, отслеживаемые по умолчанию
dotnet watch
просматривает все элементы в Watch
группе элементов в файле проекта. По умолчанию эта группа содержит все элементы в группах Compile
и EmbeddedResource
группах. dotnet watch
также сканирует весь график ссылок на проект и просматривает все файлы в этих проектах.
По умолчанию группы Compile
EmbeddedResource
включают все файлы, соответствующие следующим шаблонам глобов:
**/*.cs
*.csproj
**/*.resx
- Файлы содержимого в веб-приложениях:
wwwroot/**
По умолчанию config и .json файлы не активируют перезапуск dotnet watch, так как система конфигурации имеет собственные механизмы обработки изменений конфигурации.
Файлы можно добавить в список наблюдения или удалить из списка, изменив файл проекта. Файлы можно указать по отдельности или с помощью шаблонов glOB-объектов.
Просмотр дополнительных файлов
Дополнительные файлы можно просмотреть, добавив элементы в группу Watch
. Например, следующая разметка расширяет группу для включения файлов JavaScript:
<ItemGroup>
<Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
Игнорировать указанные файлы
dotnet watch
будет игнорироваться Compile
и EmbeddedResource
элементы с атрибутом Watch="false"
, как показано в следующем примере:
<ItemGroup>
<Compile Update="Generated.cs" Watch="false" />
<EmbeddedResource Update="Strings.resx" Watch="false" />
</ItemGroup>
dotnet watch
Будет игнорировать ссылки на проекты, имеющие Watch="false"
атрибут, как показано в следующем примере:
<ItemGroup>
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>
Расширенная конфигурация
dotnet watch
выполняет сборку во время разработки, чтобы найти элементы для просмотра. При выполнении dotnet watch
этой сборки задает свойство DotNetWatchBuild=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)?
- Да: перезапускает приложение.
- Нет. Оставляет приложение запущенным без изменений.
- Всегда: перезапускает приложение и больше не запрашивает грубые изменения.
- Никогда: оставляет приложение запущенным без изменений, и больше не запрашивает грубые изменения.
Сведения о том, какие типы изменений считаются грубыми изменениями, см. в статье "Изменение кода" и продолжение отладки и неподдерживаемых изменений в коде.
Чтобы отключить горячую --no-hot-reload
перезагрузку при запускеdotnet watch
, используйте этот параметр, как показано в следующем примере:
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
См. также
- Руководство. Разработка приложений ASP.NET Core с помощью наблюдателя за файлами
- Горячая перезагрузка в Visual Studio
- Горячая перезагрузка поддерживаемых приложений
- Горячая перезагрузка поддерживаемых изменений кода
- Выполнение тестов горячей перезагрузки
- Поддержка горячей перезагрузки для ASP.NET Core