Разработка приложений ASP.NET Core с использованием наблюдателя файловDevelop ASP.NET Core apps using a file watcher

Авторы: Рик Андерсон (Rick Anderson) и Виктор Хурдугачи (Victor Hurdugaci)By Rick Anderson and Victor Hurdugaci

dotnet watch — это средство, которое запускает команду .NET Core CLI при изменении исходных файлов.dotnet watch is a tool that runs a .NET Core CLI command when source files change. Например, в результате изменения файла может выполняться компиляция, тестирование или развертывание.For example, a file change can trigger compilation, test execution, or deployment.

В этом руководстве используется уже существующее приложение веб-API с двумя конечными точками, одна из которых возвращает сумму, а другая — произведение.This tutorial uses an existing web API with two endpoints: one that returns a sum and one that returns a product. В методе произведения есть ошибка, которая исправлена в этом руководстве.The product method has a bug, which is fixed in this tutorial.

Скачайте образец приложения.Download the sample app. Он содержит два проекта: WebApp (веб-API ASP.NET Core) и WebAppTests (модульные тесты для веб-API).It consists of two projects: WebApp (an ASP.NET Core web API) and WebAppTests (unit tests for the web API).

В командной оболочке перейдите в папку WebApp.In a command shell, navigate to the WebApp folder. Выполните следующую команду:Run the following command:

dotnet run

Примечание

Можно использовать dotnet run --project <PROJECT>, чтобы указать проект для запуска.You can use dotnet run --project <PROJECT> to specify a project to run. Например, при выполнении dotnet run --project WebApp из корневой папки примера приложения также будет запущен проект WebApp.For example, running dotnet run --project WebApp from the root of the sample app will also run the WebApp project.

В выходных данных в консоли будут показаны аналогичные следующим сообщения, которые свидетельствуют о том, что приложение выполняется и ожидает запросов:The console output shows messages similar to the following (indicating that the app is running and awaiting requests):

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

В браузере перейдите на адрес http://localhost:<port number>/api/math/sum?a=4&b=5.In a web browser, navigate to http://localhost:<port number>/api/math/sum?a=4&b=5. Должен появиться результат 9.You should see the result of 9.

Перейдите к API продукта (http://localhost:<port number>/api/math/product?a=4&b=5).Navigate to the product API (http://localhost:<port number>/api/math/product?a=4&b=5). Он возвращает 9, а не 20, как ожидалось.It returns 9, not 20 as you'd expect. Эта проблема устраняется далее в этом руководстве.That problem is fixed later in the tutorial.

Добавление dotnet watch в проектAdd dotnet watch to a project

Средство наблюдения за файлами dotnet watch входит в версию 2.1.300 пакета SDK для .NET Core.The dotnet watch file watcher tool is included with version 2.1.300 of the .NET Core SDK. Выполните следующие действия при использовании более ранней версии пакета SDK для .NET Core.The following steps are required when using an earlier version of the .NET Core SDK.

  1. Добавьте ссылку на пакет Microsoft.DotNet.Watcher.Tools в CSPROJ-файл:Add a Microsoft.DotNet.Watcher.Tools package reference to the .csproj file:

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
    </ItemGroup>
    
  2. Установите пакет Microsoft.DotNet.Watcher.Tools, запустив следующую команду:Install the Microsoft.DotNet.Watcher.Tools package by running the following command:

    dotnet restore
    

Запуск команд .NET Core CLI с помощью dotnet watchRun .NET Core CLI commands using dotnet watch

Любую команду .NET Core CLI можно запустить с dotnet watch.Any .NET Core CLI command can be run with dotnet watch. Например:For example:

КомандаCommand Команда с контрольным значениемCommand with watch
dotnet rundotnet run dotnet watch rundotnet watch run
dotnet run -f netcoreapp2.0dotnet run -f netcoreapp2.0 dotnet watch run -f netcoreapp2.0dotnet watch run -f netcoreapp2.0
dotnet run -f netcoreapp2.0 -- --arg1dotnet run -f netcoreapp2.0 -- --arg1 dotnet watch run -f netcoreapp2.0 -- --arg1dotnet watch run -f netcoreapp2.0 -- --arg1
dotnet testdotnet test dotnet watch testdotnet watch test

Запустите dotnet watch run в папке WebApp.Run dotnet watch run in the WebApp folder. В выходных данных консоли будет указано, что запущен watch.The console output indicates watch has started.

Примечание

Можно использовать dotnet watch --project <PROJECT>, чтобы указать проект для наблюдения.You can use dotnet watch --project <PROJECT> to specify a project to watch. Например, при выполнении dotnet watch --project WebApp run из корневой папки примера приложения также будет запущен проект WebApp, в том числе для наблюдения.For example, running dotnet watch --project WebApp run from the root of the sample app will also run and watch the WebApp project.

Изменения с помощью dotnet watchMake changes with dotnet watch

Убедитесь, что dotnet watch выполняется.Make sure dotnet watch is running.

Исправьте ошибку в методе Product для MathController.cs так, чтобы он возвращал произведение, а не сумму чисел.Fix the bug in the Product method of MathController.cs so it returns the product and not the sum:

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

Сохраните файл.Save the file. В выходных данных консоли будет показано, что dotnet watch обнаружил изменение файла и перезапустил приложение.The console output indicates that dotnet watch detected a file change and restarted the app.

Убедитесь, что http://localhost:<port number>/api/math/product?a=4&b=5 возвращает правильный результат.Verify http://localhost:<port number>/api/math/product?a=4&b=5 returns the correct result.

Тестирование с помощью dotnet watchRun tests using dotnet watch

  1. Снова измените метод Product для MathController.cs так, чтобы он возвращал сумму чисел.Change the Product method of MathController.cs back to returning the sum. Сохраните файл.Save the file.

  2. В командной оболочке перейдите в папку WebAppTests.In a command shell, navigate to the WebAppTests folder.

  3. Запустите dotnet restore.Run dotnet restore.

  4. Запустите dotnet watch test.Run dotnet watch test. В выходных данных будет указано, что проверка не пройдена и наблюдатель ожидает изменений в файле:Its output indicates that a test failed and that the watcher is awaiting file changes:

    Total tests: 2. Passed: 1. Failed: 1. Skipped: 0.
    Test Run Failed.
    
  5. Исправьте код метода Product так, чтобы он возвращал произведение.Fix the Product method code so it returns the product. Сохраните файл.Save the file.

dotnet watch обнаруживает изменения в файле и повторно запускает тесты.dotnet watch detects the file change and reruns the tests. В выходных данных консоли будет указано, что проверка пройдена.The console output indicates the tests passed.

Настройка списка файлов для наблюденияCustomize files list to watch

По умолчанию dotnet-watch отслеживает все файлы, соответствующие следующим стандартным маскам:By default, dotnet-watch tracks all files matching the following glob patterns:

  • **/*.cs
  • *.csproj
  • **/*.resx

Можно добавить в список наблюдения еще элементы, отредактировав файл .csproj.More items can be added to the watch list by editing the .csproj file. Элементы можно указывать по отдельности или с помощью стандартной маски.Items can be specified individually or by using glob patterns.

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

Удаление файлов из списка наблюденияOpt-out of files to be watched

Можно настроить dotnet-watch так, чтобы игнорировать параметры по умолчанию.dotnet-watch can be configured to ignore its default settings. Чтобы пропускать определенные файлы, добавьте атрибут Watch="false" в определение элемента в файле .csproj:To ignore specific files, add the Watch="false" attribute to an item's definition in the .csproj file:

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

Пользовательское наблюдение за проектамиCustom watch projects

dotnet-watch используется не только с проектами C#.dotnet-watch isn't restricted to C# projects. Создайте пользовательское наблюдение за проектами для различных ситуаций.Custom watch projects can be created to handle different scenarios. Вы можете использовать следующий макет проекта:Consider the following project layout:

  • test/test/
    • UnitTests/UnitTests.csprojUnitTests/UnitTests.csproj
    • IntegrationTests/IntegrationTests.csprojIntegrationTests/IntegrationTests.csproj

Если вы хотите наблюдать за обоими проектами, создайте пользовательский файл проекта, настроенный для наблюдения за обоими проектами:If the goal is to watch both projects, create a custom project file configured to watch both projects:

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

Чтобы запустить наблюдение за файлами для обоих проектов, внесите изменения в папку test.To start file watching on both projects, change to the test folder. Выполните следующую команду:Execute the following command:

dotnet watch msbuild /t:Test

VSTest выполняется при изменении любого файла в любом из тестовых проектов.VSTest executes when any file changes in either test project.

dotnet-watch на GitHubdotnet-watch in GitHub

dotnet-watch предоставляется в репозитории aspnet/AspNetCore на GitHub.dotnet-watch is part of the GitHub aspnet/AspNetCore repository.