Vývoj aplikací ASP.NET Core pomocí sledovacího nástroje pro soubory

Rick Anderson a Victor Hurdugaci

dotnet watch je nástroj, který při změně zdrojových souborů spouští příkaz rozhraní příkazového řádku .NET Core. Například změna souboru může aktivovat kompilaci, spuštění testu nebo nasazení.

Tento kurz používá existující webové rozhraní API se dvěma koncovými body: jedno, které vrací součet a jedno, které vrací produkt. Metoda produktu obsahuje chybu, která je opravena v tomto kurzu.

Stáhněte si ukázkovou aplikaci. Skládá se ze dvou projektů: Webová aplikace (webové rozhraní API ASP.NET Core) a WebAppTests (testy jednotek pro webové rozhraní API).

V příkazovém prostředí přejděte do složky Webové aplikace . Spusťte následující příkaz:

dotnet run

Poznámka

Můžete použít dotnet run --project <PROJECT> k zadání projektu, který se má spustit. Například spuštění dotnet run --project WebApp z kořenového adresáře ukázkové aplikace také spustí projekt webové aplikace .

Výstup konzoly zobrazuje podobné zprávy (označující, že aplikace běží a čeká na žádosti):

$ 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.

Ve webovém prohlížeči přejděte na http://localhost:<port number>/api/math/sum?a=4&b=5. Měli byste vidět výsledek 9.

Přejděte do rozhraní API produktu (http://localhost:<port number>/api/math/product?a=4&b=5). 9Vrátí , ne 20 tak, jak byste očekávali. Tento problém je opraven později v kurzu.

Přidání dotnet watch do projektu

Nástroj dotnet watch pro sledování souborů je součástí sady .NET Core SDK verze 2.1.300. Při použití starší verze sady .NET Core SDK se vyžadují následující kroky.

  1. Microsoft.DotNet.Watcher.Tools Přidejte do souboru odkaz na .csproj balíček:

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
    </ItemGroup>
    
  2. Nainstalujte balíček Microsoft.DotNet.Watcher.Tools pomocí následujícího příkazu:

    dotnet restore
    

Spouštění příkazů rozhraní příkazového řádku .NET Core pomocí dotnet watch

Jakýkoli příkaz rozhraní příkazového řádku .NET Core lze spustit pomocí dotnet watch. Příklad:

Příkaz Příkaz s hodinkami
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

Spusťte dotnet watch run ve složce webové aplikace . Výstup konzoly indikuje watch , že se spustil.

Spuštění dotnet watch run ve webové aplikaci spustí prohlížeč, který po dokončení přejde na adresu URL aplikace. dotnet watch to provede čtením výstupu konzoly aplikace a čekáním na připravenou zprávu zobrazenou uživatelem WebHost.

dotnet watch aktualizuje prohlížeč, když zjistí změny sledovaných souborů. K tomu příkaz kukátku vloží middleware do aplikace, která upraví odpovědi HTML vytvořené aplikací. Middleware přidá na stránku blok skriptu JavaScriptu, který umožňuje dotnet watch prohlížeči dát pokyn k aktualizaci. Změny všech sledovaných souborů, včetně statického obsahu, jako .html jsou soubory, .css v současné době způsobují, že se aplikace znovu sestaví.

dotnet watch:

  • Sleduje pouze soubory, které mají vliv na sestavení ve výchozím nastavení.
  • Všechny další sledované soubory (prostřednictvím konfigurace) stále mají za následek probíhající sestavení.

Další informace o konfiguraci naleznete v tématu dotnet-watch konfigurace v tomto dokumentu.

Poznámka

Můžete použít dotnet watch --project <PROJECT> k zadání projektu, který se má sledovat. Například spuštění dotnet watch --project WebApp run z kořenového adresáře ukázkové aplikace se také spustí a bude sledovat projekt webové aplikace .

Provádění změn pomocí dotnet watch

Ujistěte se, že dotnet watch je spuštěný.

Opravte chybu v Product metodě MathController.cs tak, aby vrátil produkt, a ne součet:

public static int Product(int a, int b)
{
    return a * b;
}

Soubor uložte. Výstup konzoly označuje, že dotnet watch se zjistila změna souboru a restartovala aplikaci.

Ověřte http://localhost:<port number>/api/math/product?a=4&b=5 , že vrátí správný výsledek.

Spouštění testů pomocí dotnet watch

  1. Změňte metodu ProductMathController.cs zpět na vrácení součtu. Soubor uložte.

  2. V příkazovém prostředí přejděte do složky WebAppTests .

  3. Spusťte dotnet restore.

  4. Spusťte dotnet watch test. Jeho výstup označuje, že test selhal a že sledovací proces čeká na změny souboru:

    Total tests: 2. Passed: 1. Failed: 1. Skipped: 0.
    Test Run Failed.
    
  5. Product Opravte kód metody tak, aby vrátil produkt. Soubor uložte.

dotnet watch zjistí změnu souboru a znovu spustí testy. Výstup konzoly označuje úspěšné testy.

Přizpůsobení seznamu souborů ke sledování

Ve výchozím nastavení sleduje všechny soubory odpovídající dotnet-watch následujícím vzorům globu:

  • **/*.cs
  • *.csproj
  • **/*.resx
  • Soubory obsahu: wwwroot/**, **/*.config, **/*.json

Do seznamu sledování můžete přidat další položky úpravou .csproj souboru. Položky lze zadat jednotlivě nebo pomocí vzorů globu.

<ItemGroup>
    <!-- extends watching group to include *.js files -->
    <Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>

Odhlášení souborů, které se mají sledovat

dotnet-watch je možné nakonfigurovat tak, aby ignorovala výchozí nastavení. Pokud chcete určité soubory ignorovat, přidejte Watch="false" do definice položky v .csproj souboru atribut:

<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>

Projekty vlastních hodinek

dotnet-watch není omezena na projekty jazyka C#. Projekty vlastních hodinek je možné vytvořit pro zpracování různých scénářů. Zvažte následující rozložení projektu:

  • Test/
    • UnitTests/UnitTests.csproj
    • IntegrationTests/IntegrationTests.csproj

Pokud je cílem sledovat oba projekty, vytvořte vlastní soubor projektu nakonfigurovaný tak, aby sledoval oba projekty:

<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>

Pokud chcete spustit sledování souborů v obou projektech, přejděte do testovací složky. Spusťte následující příkaz:

dotnet watch msbuild /t:Test

VSTest se spustí, když se jakýkoli soubor změní v některém testovacím projektu.

konfigurace dotnet-watch

Některé možnosti konfigurace je možné předat dotnet watch prostřednictvím proměnných prostředí. Dostupné proměnné jsou:

Nastavení Popis
DOTNET_USE_POLLING_FILE_WATCHER Pokud je nastavená hodnota "1" nebo "true", dotnet watch použije místo CoreFx FileSystemWatchersledovací proces souboru dotazování . Používá se při sledování souborů v síťových sdílených složkách nebo připojených svazcích Dockeru.
DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM Ve výchozím nastavení optimalizuje sestavení tím, že zabrání určitým operacím, dotnet watch jako je spuštění obnovení nebo opětovné vyhodnocení sady sledovaných souborů při každé změně souboru. Pokud je nastavená hodnota 1 nebo true, tyto optimalizace jsou zakázány.
DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER dotnet watch run pokusy o spuštění prohlížečů pro webové aplikace s launchBrowser nakonfigurovaným nástrojem launchSettings.json. Pokud je nastavená hodnota 1 nebo true, toto chování se potlačí.
DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH dotnet watch run při zjišťování změn souborů se pokusí aktualizovat prohlížeče. Pokud je nastavená hodnota 1 nebo true, toto chování se potlačí. Toto chování je také potlačeno, pokud DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER je nastaveno.

Aktualizace prohlížeče

dotnet watch vloží skript do aplikace, která umožňuje aktualizovat prohlížeč při změně obsahu. V některých scénářích, například když aplikace povolí kompresi odpovědí, dotnet watch nemusí být schopná vložit skript. V takových případech při vývoji ručně vložte skript do aplikace. Pokud chcete například nakonfigurovat webovou aplikaci tak, aby skript vložil ručně, aktualizujte soubor rozložení tak, aby zahrnoval _framework/aspnet-browser-refresh.js:

@* _Layout.cshtml *@
<environment names="Development">
    <script src="/_framework/aspnetcore-browser-refresh.js"></script>
</environment>

Jiné znaky než ASCII

Visual Studio 17.2 a novější obsahuje sadu .NET SDK 6.0.300 a novější. Se sadou .NET SDK a 6.0.300 novějším dotnet-watch vygeneruje do konzoly znaky jiné než ASCII během relace opětovného načítání za provozu. U některých hostitelů konzoly, jako je například hostitel systému Windows, se tyto znaky můžou objevit zkomolené. Abyste se vyhnuli zkomoleným znakům, zvažte jeden z následujících přístupů:

  • Nakonfigurujte proměnnou DOTNET_WATCH_SUPPRESS_EMOJIS=1 prostředí tak, aby potlačí generování těchto hodnot.
  • Přepněte na jiný terminál, například https://github.com/microsoft/terminal, který podporuje vykreslování znaků jiných než ASCII.