dotnet watch
Este artículo se aplica a: ✔️ SDK de .NET Core 3.1 y versiones posteriores
Nombre
dotnet watch
: reinicia o realiza la recarga activa de la aplicación especificada, o ejecuta un comando dotnet especificado, cuando se detectan cambios en el código fuente.
Sinopsis
dotnet watch [<command>]
[--list]
[--no-hot-reload] [--non-interactive]
[--project <PROJECT>]
[-q|--quiet] [-v|--verbose]
[--version]
[--] <forwarded arguments>
dotnet watch -?|-h|--help
Descripción
El comando dotnet watch
es un monitor de archivos. Cuando detecta un cambio, ejecuta el dotnet run
comando o un comando especificado dotnet
. Si ejecuta dotnet run
, y la recarga activa, realiza esta operación en la aplicación especificada. Si no se admite el cambio, reinicia la aplicación. Este proceso permite un desarrollo iterativo rápido desde la línea de comandos.
Mientras ejecuta dotnet watch
, puede forzar la recompilación y el reinicio de la aplicación presionando Ctrl+R en el shell de comandos. Esta característica solo está disponible mientras se ejecuta la aplicación. Por ejemplo, si se ejecuta dotnet watch
en una aplicación de consola que termina antes de presionar Ctrl+R, esta acción no tiene ningún efecto. Sin embargo, en ese caso dotnet watch
sigue viendo los archivos y reiniciará la aplicación si se actualiza un archivo.
Compresión de las respuestas
Si dotnet watch
se ejecuta para una aplicación que usa la compresión de respuesta, la herramienta no puede insertar el script de actualización del explorador. En .NET 7 y versiones posteriores de la herramienta se muestra un mensaje de advertencia como el siguiente:
advertencia: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware[4]
No se ha podido configurar la inserción de scripts de actualización del explorador en la respuesta. Esto puede deberse a la codificación del contenido de la respuesta: "br". Considere la posibilidad de deshabilitar la compresión de la respuesta.
Como alternativa a deshabilitar la compresión de la respuesta, agregue manualmente la referencia de JavaScript de actualización del explorador a las páginas de la aplicación:
@if (Environment.GetEnvironmentVariable("__ASPNETCORE_BROWSER_TOOLS") is not null)
{
<script src="/_framework/aspnetcore-browser-refresh.js"></script>
}
Argumentos
<command>
En el SDK de .NET 7 y versiones anteriores,
dotnet watch
puede ejecutar cualquier comando que se envíe a través del ejecutable, como comandos integrados de ladotnet
CLI y herramientas globales. Si puede ejecutardotnet <command>
, puede ejecutardotnet watch <command>
.En el SDK de .NET 8 y versiones posteriores,
dotnet watch
puede ejecutardotnet run
,dotnet build
odotnet test
. Especifiquerun
,build
otest
para<command>
.Si no se especifica el comando secundario, el valor predeterminado es
run
paradotnet run
.<forwarded arguments>
Los argumentos proporcionados después de pasar un guión doble (
--
) al proceso secundariodotnet
. Si ejecutadotnet watch run
, estos argumentos son opciones para dotnet run. Si está ejecutandodotnet watch test
, estos argumentos son opciones para dotnet test.
Opciones
--list
Enumera todos los archivos detectados sin iniciar el monitor.
--no-hot-reload
Suprime la recarga activa para las aplicaciones compatibles.
--non-interactive
Ejecuta
dotnet watch
en modo no interactivo. Use esta opción para evitar que se solicite la entrada de la consola. Cuando se habilita la recarga activa y se detecta una edición superficial, dotnet watch reinicia la aplicación. Disponible a partir del SDK de .NET 7.--project <PATH>
Especifica la ruta de acceso del archivo de proyecto que se va a ejecutar (solo la carpeta o se incluye el nombre del archivo del proyecto). Si no se especifica, se toma como predeterminado el directorio actual.
-q|--quiet
Suprime toda la salida generada por el comando
dotnet watch
, excepto advertencias y errores. La opción no se pasa a comandos secundarios. Por ejemplo, se sigue generando la salida dedotnet restore
ydotnet run
.-v|--verbose
Muestra la salida detallada de la depuración.
--version
Muestra la versión de
dotnet watch
.--
La opción de doble guion ("--") se puede usar para delimitar las opciones
dotnet watch
de los argumentos que se pasarán al proceso secundario. Su uso es opcional. Cuando no se usa la opción de doble guion,dotnet watch
considera que el primer argumento no reconocido es el principio de los argumentos que se deben pasar al procesodotnet
secundario.
Variables de entorno
dotnet watch
usa las siguientes variables de entorno:
DOTNET_HOTRELOAD_NAMEDPIPE_NAME
Este valor se configura con
dotnet watch
cuando se va a iniciar la aplicación, y especifica la canalización con nombre.DOTNET_USE_POLLING_FILE_WATCHER
Si se establece en
1
otrue
,dotnet watch
usa un monitor de archivo de sondeo en lugar de System.IO.FileSystemWatcher. El sondeo es necesario en algunos sistemas de archivos, como los recursos compartidos de red, los volúmenes montados de Docker y otros sistemas de archivos virtuales. La clase PhysicalFileProvider utilizaDOTNET_USE_POLLING_FILE_WATCHER
para determinar si el método PhysicalFileProvider.Watch se basará en PollingFileChangeToken.DOTNET_WATCH
dotnet watch
establece esta variable en1
en todos los procesos secundarios que se inician.DOTNET_WATCH_AUTO_RELOAD_WS_HOSTNAME
Como parte de
dotnet watch
, el mecanismo del servidor de actualización del explorador lee este valor para determinar el entorno de host de WebSocket. El valor127.0.0.1
se reemplaza porlocalhost
, y los esquemashttp://
yhttps://
se reemplazan porws://
ywss://
respectivamente.DOTNET_WATCH_ITERATION
dotnet watch
establece esta variable en1
y se incrementa en uno cada vez que un archivo cambia y el comando se reinicia o se realiza la recarga activa de la aplicación.DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH
Cuando se establece en
1
otrue
,dotnet watch
no actualizará los exploradores cuando se detecten cambios en el archivo.DOTNET_WATCH_SUPPRESS_EMOJIS
Con el SDK de .NET 6.0.300 y versiones posteriores,
dotnet watch
emite caracteres que no son ASCII a la consola, como se muestra en el ejemplo siguiente: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...
En determinados hosts de consola, estos caracteres pueden parecer indescifrables. Para evitar ver caracteres indescifrables, establezca esta variable en
1
otrue
.DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER
Cuando se establece en
1
otrue
,dotnet watch
no iniciará ni actualizará los exploradores de las aplicaciones web que tengan configuradolaunchBrowser
en launchSettings.json.DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM
De forma predeterminada,
dotnet watch
optimiza la compilación evitando ciertas operaciones, como ejecutar la restauración o volver a evaluar el conjunto de archivos inspeccionados con cada cambio de archivo. Si esta variable se establece en1
otrue
, estas optimizaciones se deshabilitan.DOTNET_WATCH_SUPPRESS_STATIC_FILE_HANDLING
Cuando se establece en
1
otrue
,dotnet watch
no hará un control especial de los archivos de contenido estático.dotnet watch
establece la propiedadDotNetWatchContentFiles
de MSBuild enfalse
.DOTNET_WATCH_RESTART_ON_RUDE_EDIT
Cuando se establezca en
1
otrue
,dotnet watch
siempre se reiniciará en ediciones superficiales, en lugar de preguntar.
Archivos inspeccionados de forma predeterminada
dotnet watch
inspecciona todos los elementos del grupo de elementos Watch
del archivo de proyecto. De forma predeterminada, este grupo incluye todos los elementos de los grupos Compile
y EmbeddedResource
. dotnet watch
también examina todo el grafo de referencias del proyecto r inspecciona todos los archivos de esos proyectos.
De forma predeterminada, los grupos Compile
y EmbeddedResource
incluyen todos los archivos que coinciden con los siguientes patrones globales:
**/*.cs
*.csproj
**/*.resx
- Archivos de contenido en aplicaciones web:
wwwroot/**
De forma predeterminada, los archivos .config y .json no desencadenan un reinicio dotnet watch porque el sistema de configuración tiene sus propios mecanismos para controlar los cambios de configuración.
Los archivos se pueden agregar a la lista de inspección o se pueden quitar de la lista editando el archivo del proyecto. Los elementos se pueden especificar individualmente o usando patrones globales.
Inspección de archivos adicionales
Se pueden inspeccionar más archivos agregando elementos al grupo Watch
. Por ejemplo, el marcado siguiente amplía ese grupo para incluir archivos JavaScript:
<ItemGroup>
<Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
Omisión de los archivos especificados
dotnet watch
omitirá los elementos Compile
y EmbeddedResource
que tienen el atributo Watch="false"
, como se muestra en el ejemplo siguiente:
<ItemGroup>
<Compile Update="Generated.cs" Watch="false" />
<EmbeddedResource Update="Strings.resx" Watch="false" />
</ItemGroup>
dotnet watch
omitirá las referencias de proyecto que tienen el atributo Watch="false"
, como se muestra en el ejemplo siguiente:
<ItemGroup>
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>
Configuración avanzada
dotnet watch
realiza una compilación en tiempo de diseño para buscar elementos que se van a inspeccionar. Cuando se ejecuta esta compilación, dotnet watch
establece la propiedad DotNetWatchBuild=true
. Esta propiedad se puede usar como se muestra en el ejemplo siguiente:
<ItemGroup Condition="'$(DotNetWatchBuild)'=='true'">
<!-- only included in the project when dotnet-watch is running -->
</ItemGroup>
Recarga activa
A partir de .NET 6, dotnet watch
incluye compatibilidad con la recarga activa. La recarga activa es una característica que permite aplicar cambios a una aplicación en ejecución sin tener que recompilarla y reiniciarla. Los cambios pueden ser en archivos de código o recursos estáticos, como archivos de hoja de estilos y archivos JavaScript. Esta característica simplifica la experiencia de desarrollo local, ya que proporciona comentarios inmediatos al modificar la aplicación.
Para información sobre los tipos de aplicaciones y las versiones de .NET que admiten la recarga activa, consulte Escenarios y marcos de aplicaciones .NET compatibles.
Ediciones superficiales
Cuando se modifica un archivo, dotnet watch
determina si la aplicación se puede recargar de forma activa. Si no se puede volver a realizar la recarga activa, el cambio se denomina edición superficial y dotnet watch
le pregunta si desea reiniciar la aplicación:
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)?
- Sí: reinicia la aplicación.
- No: deja que se ejecute la aplicación sin aplicar los cambios.
- Siempre: reinicia la aplicación y ya no solicita ediciones superficiales.
- Nunca: deja que se ejecute la aplicación sin aplicar los cambios y ya no se solicitan ediciones superficiales.
Para información sobre los tipos de cambios que se consideran ediciones superficiales, consulte Editar código y continuar con la depuración y Cambios no admitidos en el código.
Para deshabilitar la recarga activa al ejecutar dotnet watch
, use la opción --no-hot-reload
, como se muestra en el ejemplo siguiente:
dotnet watch --no-hot-reload
Ejemplos
Ejecute
dotnet run
para el proyecto en el directorio actual cada vez que cambie el código fuente:dotnet watch
O:
dotnet watch run
Ejecute
dotnet test
para el proyecto en el directorio actual cada vez que cambie el código fuente:dotnet watch test
Ejecute
dotnet run --project ./HelloWorld.csproj
cada vez que cambie el código fuente:dotnet watch run --project ./HelloWorld.csproj
Ejecute
dotnet run -- arg0
para el proyecto en el directorio actual cada vez que cambie el código fuente:dotnet watch run -- arg0
O:
dotnet watch -- run arg0