Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Door Rick Anderson en Victor Hurdugaci
dotnet watch is een hulpprogramma waarmee een .NET CLI-opdracht wordt uitgevoerd wanneer bronbestanden worden gewijzigd. Een bestandswijziging kan bijvoorbeeld compilatie, testuitvoering of implementatie activeren.
In deze zelfstudie wordt een bestaande web-API met twee eindpunten gebruikt: een api die een som retourneert en één die een product retourneert. De productmethode heeft een bug, die in deze handleiding is opgelost.
Download de voorbeeld-app. Het bestaat uit twee projecten: WebApp (een ASP.NET Core-web-API) en WebAppTests (eenheidstests voor de web-API).
Navigeer in een opdrachtshell naar de map WebApp . Voer de volgende opdracht uit:
dotnet run
Note
U kunt een dotnet run --project <PROJECT> project opgeven dat moet worden uitgevoerd. Als u dotnet run --project WebApp uitvoert vanuit de hoofdmap van de voorbeeld-app, wordt ook het WebApp-project uitgevoerd.
In de console-uitvoer ziet u berichten die vergelijkbaar zijn met het volgende (waarmee wordt aangegeven dat de app wordt uitgevoerd en in afwachting is van aanvragen):
$ 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.
Navigeer in een webbrowser naar http://localhost:<port number>/api/math/sum?a=4&b=5. U zou het resultaat van 9 moeten zien.
Navigeer naar de product-API (http://localhost:<port number>/api/math/product?a=4&b=5). Het retourneert 9, niet 20 zoals u zou verwachten. Dit probleem is verderop in de zelfstudie opgelost.
Toevoegen dotnet watch aan een project
Het dotnet watch hulpprogramma file watcher is opgenomen in versie 2.1.300 van de .NET SDK. De volgende stappen zijn vereist wanneer u een eerdere versie van de .NET SDK gebruikt.
Voeg een
Microsoft.DotNet.Watcher.Toolspakketreferentie toe aan het.csprojbestand:<ItemGroup> <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" /> </ItemGroup>Installeer het
Microsoft.DotNet.Watcher.Toolspakket door het volgende uit te voeren:dotnet restore
.NET CLI-opdrachten uitvoeren met behulp van dotnet watch
Elke .NET CLI-opdracht kan worden uitgevoerd met dotnet watch. For example:
| Command | Opdracht met horloge |
|---|---|
| dotnet run | dotnet watch run |
| dotnet-uitvoering -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 |
Voer dotnet watch run uit in de map WebApp. De console-uitvoer geeft aan dat watch is gestart.
Als u een web-app uitvoert dotnet watch run, wordt een browser gestart die naar de URL van de app navigeert zodra deze klaar is.
dotnet watch doet dit door de uitvoer van de console van de app te lezen en te wachten op het gereede bericht dat wordt weergegeven door WebHost.
dotnet watch vernieuwt de browser wanneer wijzigingen in bekeken bestanden worden gedetecteerd. Hiervoor injecteert de watch-opdracht een middleware in de app die HTML-antwoorden wijzigt die door de app zijn gemaakt. De middleware voegt een JavaScript-codeblok toe aan de pagina waarmee dotnet watch de browser kan instrueren om te vernieuwen. Op dit moment worden alle bekeken bestanden gewijzigd, inclusief statische inhoud zoals .html en .css bestanden, waardoor de app opnieuw wordt opgebouwd.
dotnet watch:
- Alleen bekijkt bestanden die standaard van invloed zijn op builds.
- Alle extra bekeken bestanden (via configuratie) resulteert nog steeds in een build die plaatsvindt.
Zie de configuratie van dotnet-watch in dit document voor meer informatie over configuratie.
Note
U kunt een dotnet watch --project <PROJECT> project opgeven om te bekijken. Als u bijvoorbeeld dotnet watch --project WebApp run vanuit de hoofdmap van de voorbeeldapplicatie uitvoert, zal ook het WebApp-project uitgevoerd en gemonitord worden.
Wijzigingen aanbrengen met dotnet watch
Zorg ervoor dat dotnet watch wordt uitgevoerd.
Corrigeer de fout in de Product methode zodat MathController.cs het het product retourneert en niet de som:
public static int Product(int a, int b)
{
return a * b;
}
Sla het bestand op. De console-uitvoer geeft aan dat dotnet watch er een bestandswijziging is gedetecteerd en de app opnieuw is opgestart.
Controleer of http://localhost:<port number>/api/math/product?a=4&b=5 het juiste resultaat wordt geretourneerd.
Tests uitvoeren met dotnet watch
Wijzig de
Productmethode vanMathController.cszodat deze de som teruggeeft. Sla het bestand op.Navigeer in een opdrachtshell naar de map WebAppTests .
Voer dotnet-herstel uit.
Voer
dotnet watch testuit. De uitvoer geeft aan dat een test is mislukt en dat de watcher op bestandswijzigingen wacht:Total tests: 2. Passed: 1. Failed: 1. Skipped: 0. Test Run Failed.Corrigeer de
Productmethodecode zodat het product wordt geretourneerd. Sla het bestand op.
dotnet watch detecteert de bestandswijziging en voert de tests opnieuw uit. De console-uitvoer geeft aan dat de tests zijn geslaagd.
Bestandenlijst aanpassen om te bekijken
dotnet-watch Standaard worden alle bestanden bijgehouden die overeenkomen met de volgende globpatronen:
**/*.cs*.csproj**/*.resx- Inhoudsbestanden:
wwwroot/**,**/*.config**/*.json
Meer items kunnen aan de volglijst worden toegevoegd door het .csproj bestand te bewerken. Items kunnen afzonderlijk worden opgegeven of door globpatronen te gebruiken.
<ItemGroup>
<!-- extends watching group to include *.js files -->
<Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
Afmelden voor bestanden die moeten worden bekeken
dotnet-watch kan worden geconfigureerd om de standaardinstellingen te negeren. Als u specifieke bestanden wilt negeren, voegt u het kenmerk toe aan de Watch="false" definitie van een item in het .csproj bestand:
<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>
Aangepaste horlogeprojecten
dotnet-watch is niet beperkt tot C#-projecten. Aangepaste watchprojecten kunnen worden gemaakt om verschillende scenario's af te handelen. Houd rekening met de volgende projectindeling:
-
test/
UnitTests/UnitTests.csprojIntegrationTests/IntegrationTests.csproj
Als het doel is om beide projecten te bekijken, maakt u een aangepast projectbestand dat is geconfigureerd om beide projecten te bekijken:
<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>
Om het bekijken van bestanden bij beide projecten te starten, ga naar de test map. Voer de volgende opdracht uit:
dotnet watch msbuild /t:Test
VSTest wordt uitgevoerd wanneer bestanden in een testproject worden gewijzigd.
dotnet-watch configuration
Sommige configuratieopties kunnen aan dotnet watch worden doorgegeven via omgevingsvariabelen. De beschikbare variabelen zijn:
| Setting | Description |
|---|---|
DOTNET_USE_POLLING_FILE_WATCHER |
Als deze optie is ingesteld op '1' of 'true', dotnet watch gebruikt u een polling file watcher in plaats van CoreFx's FileSystemWatcher. Wordt gebruikt bij het bekijken van bestanden op netwerkshares of gekoppelde Docker-volumes. |
DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM |
Standaard optimaliseert dotnet watch de build door bepaalde bewerkingen te vermijden, zoals het uitvoeren van herstel of het opnieuw evalueren van de lijst met bekeken bestanden bij elke wijziging van een bestand. Als deze optie is ingesteld op '1' of 'true', worden deze optimalisaties uitgeschakeld. |
DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER |
dotnet watch run probeert browsers voor web-apps te starten met launchBrowser geconfigureerd in launchSettings.json. Als dit is ingesteld op '1' of 'true', wordt dit gedrag onderdrukt. |
DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH |
dotnet watch run probeert browsers te vernieuwen wanneer bestandswijzigingen worden gedetecteerd. Als dit is ingesteld op '1' of 'true', wordt dit gedrag onderdrukt. Dit gedrag wordt ook onderdrukt als DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER is ingesteld. |
Browser refresh
dotnet watch injecteert een script in de app dat het mogelijk maakt de browser te verversen wanneer de inhoud verandert. In sommige scenario's, zoals wanneer de app reactiecompressie inschakelt, dotnet watch kan het script mogelijk niet worden geïnjecteerd. Voor dergelijke gevallen in ontwikkeling moet u het script handmatig in de app injecteren. Als u bijvoorbeeld de web-app wilt configureren voor het handmatig injecteren van het script, werkt u het indelingsbestand bij met _framework/aspnet-browser-refresh.js:
@* _Layout.cshtml *@
<environment names="Development">
<script src="/_framework/aspnetcore-browser-refresh.js"></script>
</environment>
Non-ASCII characters
Visual Studio 17.2 of hoger bevat de .NET SDK 6.0.300 of hoger. Met de .NET SDK versie 6.0.300 en later, verzendt dotnet-watch niet-ASCII-tekens naar de console tijdens een hot reload sessie. Op bepaalde consolehosts, zoals de Windows-conhost, kunnen deze tekens vervormd worden weergegeven. Als u vervormde tekens wilt voorkomen, kunt u een van de volgende methoden overwegen:
- Configureer de
DOTNET_WATCH_SUPPRESS_EMOJIS=1omgevingsvariabele om deze waarden te onderdrukken. - Schakel over naar een andere terminal, zoals https://github.com/microsoft/terminal, die ondersteuning biedt voor het weergeven van niet-ASCII-tekens.