Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Rick Anderson und Victor Hurdugaci
dotnet watch ist ein Tool, das einen .NET CLI-Befehl ausführt, wenn sich Quelldateien ändern. Beispielsweise kann eine Dateiänderung die Kompilierung, die Testausführung oder die Bereitstellung auslösen.
In diesem Lernprogramm wird eine vorhandene Web-API mit zwei Endpunkten verwendet: eine, die eine Summe zurückgibt und eine, die ein Produkt zurückgibt. Die Produktmethode hat einen Fehler, der in diesem Lernprogramm behoben ist.
Laden Sie die Beispiel-App herunter. Es besteht aus zwei Projekten: WebApp (eine ASP.NET Core Web API) und WebAppTests (Komponententests für die Web-API).
Navigieren Sie in einer Befehlsshell zum WebApp-Ordner . Führen Sie den folgenden Befehl aus:
dotnet run
Note
Sie können verwenden dotnet run --project <PROJECT> , um ein auszuführenes Projekt anzugeben. Wenn Sie beispielsweise dotnet run --project WebApp aus dem Stammverzeichnis der Sample-App ausführen, wird auch das WebApp-Projekt ausgeführt.
Die Konsolenausgabe zeigt Nachrichten ähnlich wie die folgenden an (dies gibt an, dass die App ausgeführt wird und auf Anforderungen wartet):
$ dotnet run
Hosting environment: Development
Content root path: C:/Docs/aspnetcore/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Navigieren Sie in einem Webbrowser zu http://localhost:<port number>/api/math/sum?a=4&b=5. Sie sollten sich das Ergebnis von 9 ansehen.
Navigieren Sie zur Produkt-API (http://localhost:<port number>/api/math/product?a=4&b=5). Es gibt 9 zurück, nicht 20, wie man erwarten würde. Dieses Problem wurde später im Lernprogramm behoben.
dotnet watch zu einem Projekt hinzufügen
Das dotnet watch Dateiüberwachungstool ist in Version 2.1.300 des .NET SDK enthalten. Die folgenden Schritte sind erforderlich, wenn Sie eine frühere Version des .NET SDK verwenden.
Fügen Sie der
Microsoft.DotNet.Watcher.ToolsDatei einen.csprojPaketverweis hinzu:<ItemGroup> <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" /> </ItemGroup>Installieren Sie das
Microsoft.DotNet.Watcher.Tools-Paket, indem Sie den folgenden Befehl ausführen:dotnet restore
Ausführen von .NET CLI-Befehlen mit dotnet watch
Jeder .NET CLI-Befehl kann mit dotnet watch ausgeführt werden. Beispiel:
| Command | Befehl mit watch |
|---|---|
| dotnet run | dotnet watch run |
| dotnet run -f netcoreapp3.1 | dotnet watch run -f netcoreapp3.1 |
| dotnet run -f netcoreapp3.1 -- --arg1 | dotnet watch run -f netcoreapp3.1 -- --arg1 |
| dotnet test | dotnet watch test |
Führen Sie dotnet watch run im Ordner WebApp aus. Die Konsolenausgabe gibt an, dass watch gestartet wurde.
Das Ausführen von dotnet watch run auf einer Web-App startet einen Browser, der zur URL der App navigiert, sobald die App bereit ist.
dotnet watch tut dies, indem es die Konsolenausgabe der App liest und auf die von WebHost angezeigte Bereitschaftsmeldung wartet.
dotnet watch aktualisiert den Browser, wenn Änderungen an überwachten Dateien erkannt werden. Dazu fügt der Überwachungsbefehl eine Middleware in die App ein, die HTML-Antworten ändert, die von der App erstellt wurden. Die Middleware fügt der Seite einen JavaScript-Skriptblock hinzu, der es dotnet watch ermöglicht, den Browser zum Aktualisieren aufzufordern. Derzeit führen Änderungen an allen überwachten Dateien, einschließlich statischer Inhalte wie .html und .css Dateien, dazu, dass die App neu erstellt wird.
dotnet watch:
- Überwacht nur Dateien, die sich standardmäßig auf Builds auswirken.
- Alle (per Konfiguration) zusätzlich überwachten Dateien führen weiterhin dazu, dass ein Build erstellt wird.
Weitere Informationen zur Konfiguration finden Sie in diesem Dokument unter dotnet-watch-Konfiguration .
Note
Sie können zum Angeben eines zu überwachenden Projekts verwenden dotnet watch --project <PROJECT> . Beispielsweise wird durch Ausführen von dotnet watch --project WebApp run aus dem Stammverzeichnis der Beispiel-App auch das WebApp-Projekt ausgeführt und überwacht.
Änderungen vornehmen mit dotnet watch
Stellen Sie sicher, dass dotnet watch ausgeführt wird.
Beheben Sie den Fehler in der Product Methode, MathController.cs damit es das Produkt und nicht die Summe zurückgibt:
public static int Product(int a, int b)
{
return a * b;
}
Speichern Sie die Datei. Die Konsolenausgabe gibt an, dass dotnet watch eine Dateiänderung erkannt und die App neu gestartet wurde.
Überprüfen Sie, ob http://localhost:<port number>/api/math/product?a=4&b=5 das richtige Ergebnis zurückgibt.
Ausführen von Tests mithilfe von dotnet watch
Ändern Sie die Methode von
ProductbeiMathController.cs, sodass sie wieder die Summe zurückgibt. Speichern Sie die Datei.Navigieren Sie in einer Befehlsshell zum Ordner "WebAppTests ".
Führen Sie die dotnet-Wiederherstellung aus.
Führen Sie
dotnet watch testaus. Die Ausgabe gibt an, dass ein Test fehlgeschlagen ist und dass der Watcher auf Dateiänderungen wartet:Total tests: 2. Passed: 1. Failed: 1. Skipped: 0. Test Run Failed.Korrigieren Sie den
ProductMethodencode, damit es das Produkt zurückgibt. Speichern Sie die Datei.
dotnet watch erkennt die Dateiänderung und führen die Tests erneut aus. Die Konsolenausgabe gibt die bestandenen Tests an.
Anpassen der Dateiliste zur Überwachung
Standardmäßig wird dotnet-watch verwendet, um alle Dateien zu verfolgen, die den folgenden Globmustern entsprechen:
**/*.cs*.csproj**/*.resx- Inhaltsdateien:
wwwroot/**, ,**/*.config**/*.json
Weitere Elemente können der Überwachungsliste durch Bearbeiten der .csproj Datei hinzugefügt werden. Elemente können einzeln oder mithilfe von Globmustern angegeben werden.
<ItemGroup>
<!-- extends watching group to include *.js files -->
<Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
Abmelden von Dateien, die überwacht werden sollen
dotnet-watch kann so konfiguriert werden, dass die Standardeinstellungen ignoriert werden. Um bestimmte Dateien zu ignorieren, fügen Sie das Watch="false" Attribut zur Definition eines Elements in der .csproj Datei hinzu:
<ItemGroup>
<!-- exclude Generated.cs from dotnet-watch -->
<Compile Include="Generated.cs" Watch="false" />
<!-- exclude Strings.resx from dotnet-watch -->
<EmbeddedResource Include="Strings.resx" Watch="false" />
<!-- exclude changes in this referenced project -->
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>
<ItemGroup>
<!-- Exclude all Content items from being watched. -->
<Content Update="@(Content)" Watch="false" />
</ItemGroup>
Benutzerdefinierte Uhrenprojekte
dotnet-watch ist nicht auf C#-Projekte beschränkt. Benutzerdefinierte Uhrenprojekte können erstellt werden, um verschiedene Szenarien zu behandeln. Betrachten Sie das folgende Projektlayout:
-
test/
UnitTests/UnitTests.csprojIntegrationTests/IntegrationTests.csproj
Wenn beide Projekte überwacht werden sollen, erstellen Sie eine benutzerdefinierte Projektdatei, die für die Überwachung beider Projekte konfiguriert ist:
<Project>
<ItemGroup>
<TestProjects Include="**\*.csproj" />
<Watch Include="**\*.cs" />
</ItemGroup>
<Target Name="Test">
<MSBuild Targets="VSTest" Projects="@(TestProjects)" />
</Target>
<Import Project="$(MSBuildExtensionsPath)\Microsoft.Common.targets" />
</Project>
Um die Dateibeobachtung für beide Projekte zu starten, wechseln Sie in den Testordner . Führen Sie den folgenden Befehl aus:
dotnet watch msbuild /t:Test
VSTest wird ausgeführt, wenn sich dateien in beiden Testprojekts ändern.
dotnet-watch-Konfiguration
Einige Konfigurationsoptionen können an dotnet watch durch Umgebungsvariablen übergeben werden. Die verfügbaren Variablen sind:
| Setting | Description |
|---|---|
DOTNET_USE_POLLING_FILE_WATCHER |
Wenn diese Einstellung auf „1“ oder „true“ festgelegt ist, verwendet dotnet watch anstelle von FileSystemWatcher von CoreFx einen Polling-Dateiwatcher. Wird beim Überwachen von Dateien in Netzwerkfreigaben oder in auf Docker bereitgestellten Volumes verwendet. |
DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM |
Standardmäßig optimiert dotnet watch den Build, indem bestimmte Vorgänge wie das Ausführen des Wiederherstellungsvorgangs oder eine erneute Bewertung der überwachten Datei-Sets für jede Dateiänderung vermieden werden. Wenn dieser Wert auf "1" oder "true" festgelegt ist, werden diese Optimierungen deaktiviert. |
DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER |
dotnet watch run versucht, Browser für Web-Apps zu starten, wobei launchBrowser in launchSettings.json konfiguriert ist. Wenn dieser Wert auf "1" oder "true" festgelegt ist, wird dieses Verhalten unterdrückt. |
DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH |
dotnet watch run versucht, Browser zu aktualisieren, wenn Dateiänderungen erkannt werden. Wenn dieser Wert auf "1" oder "true" festgelegt ist, wird dieses Verhalten unterdrückt. Dieses Verhalten wird auch unterdrückt, wenn DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER festgelegt wird. |
Browseraktualisierung
dotnet watch fügt ein Skript in die App ein, mit dem der Browser aktualisiert werden kann, wenn sich der Inhalt ändert. In einigen Szenarien, z. B. wenn die App die Reaktionskomprimierung aktiviert, dotnet watch kann das Skript möglicherweise nicht eingefügt werden. Bei solchen Fällen in der Entwicklung wird das Skript manuell in die App eingefügt. Um beispielsweise die Web-App so zu konfigurieren, dass das Skript manuell eingefügt wird, aktualisieren Sie die Layoutdatei so, dass folgendes enthalten _framework/aspnet-browser-refresh.jsist:
@* _Layout.cshtml *@
<environment names="Development">
<script src="/_framework/aspnetcore-browser-refresh.js"></script>
</environment>
Nicht-ASCII-Zeichen
Visual Studio 17.2 oder höher enthält das .NET SDK 6.0.300 oder höher. Mit der .NET SDK Version 6.0.300 und später gibt dotnet-watch während einer Hot-Reload-Sitzung nicht-ASCII-Zeichen an die Konsole aus. Auf bestimmten Konsolenhosts, wie zum Beispiel dem Windows-Conhost, können diese Zeichen möglicherweise fehlerhaft angezeigt werden. Um unleserliche Zeichen zu vermeiden, können Sie einen der folgenden Ansätze berücksichtigen.
- Konfigurieren Sie die
DOTNET_WATCH_SUPPRESS_EMOJIS=1Umgebungsvariable, um diese Werte zu unterdrücken. - Wechseln Sie zu einem anderen Terminal, wie beispielsweise https://github.com/microsoft/terminal, das die Wiedergabe von Nicht-ASCII-Zeichen unterstützt.
Dateiüberwachungsgrenzwerte in Linux
Wenn Sie dotnet watch unter Linux oder in Docker-Containern ausführen, tritt möglicherweise ein Fehler auf, dass der konfigurierte Grenzwert pro Benutzer für die Anzahl der inotify-Instanzen erreicht wurde:
The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached.
Wenn das Instanzlimit für inotify erreicht ist, erhöhen Sie fs.inotify.max_user_instances. Wenn der Prozess seinen Grenzwert für die Open-File-Deskriptor erreicht hat, erhöhen Sie stattdessen diesen Grenzwert. Die gesonderte fs.inotify.max_user_watches Einstellung gilt, wenn das Limit für inotify-Überwachungen ausgeschöpft ist.
Führen Sie die folgenden Befehle aus, um diese Grenzwerte vorübergehend zu erhöhen:
sudo sysctl fs.inotify.max_user_instances=524288
sudo sysctl fs.inotify.max_user_watches=524288
Um diese Änderung dauerhaft zu ändern, fügen Sie der /etc/sysctl.conf Datei die folgenden Zeilen hinzu:
fs.inotify.max_user_instances=524288
fs.inotify.max_user_watches=524288
Note
Bei Docker-Containern werden diese Grenzwerte vom Hostbetriebssystem geerbt. Sie müssen die sysctl Einstellungen auf dem Hostcomputer und nicht innerhalb des Containers konfigurieren.