Разработка ASP.NET Core приложений с помощью dotnet watch

Victor Hurdugaci

Введение

dotnet watch - это средство разработки, которое запускает команду dotnet при изменении исходных файлов. Его можно использовать для компиляции, запуска тестов или публикации, когда меняется код.

В этом руководстве мы будем использовать существующее WebApi приложение, которое высчитывает сумму и произведение двух чисел, чтобы вы увидели случаи использования dotnet watch. В приложении содержится намеренная ошибка, которую мы исправим.

Начинаем

Скачайте приложение. Оно содержит два проекта, WebApp (веб приложение) и WebAppTests (юнит тесты для приложения).

В консоли откройте папку, куда вы скачали приложение, и запустите:

  1. dotnet restore
  2. cd WebApp
  3. dotnet run

В результате в консоли вы увидите схожие сообщения, где говорится, что приложение сейчас запущено и находится в ожидании запросов:

$ dotnet run
Project WebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling WebApp for .NETCoreApp,Version=v1.0

Compilation succeeded.
  0 Warning(s)
  0 Error(s)

Time elapsed 00:00:02.6049991

Hosting environment: Production
Content root path: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

В веб браузере перейдите на http://localhost:5000/api/math/sum?a=4&b=5, вы должны увидеть результат 9.

При переходе на http://localhost:5000/api/math/product?a=4&b=5, вы ожидаете увидеть 20. Вместо этого вы снова увидите 9.

Мы это исправим.

Добавление в проект dotnet watch

  1. Добавьте Microsoft.DotNet.Watcher.Tools в раздел tools файла WebApp/project.json:
"tools": {
  "Microsoft.DotNet.Watcher.Tools": "1.0.0-preview2-final"
},
  1. Запустите dotnet restore.

В косоли вы увидите схожие сообщения:

log  : Restoring packages for /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/project.json...
log  : Restoring packages for tool 'Microsoft.DotNet.Watcher.Tools' in /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/project.json...
log  : Installing Microsoft.DotNet.Watcher.Core 1.0.0-preview2-final.
log  : Installing Microsoft.DotNet.Watcher.Tools 1.0.0-preview2-final.

Запуск команд dotnet с помощью dotnet watch

Любую dotnet команду можно запустить с помощью dotnet watch. Например:

Команда Команда с watch
dotnet run dotnet watch run
dotnet run -f net451 dotnet watch run -f net451
dotnet run -f net451 -- --arg1 dotnet watch run -f net451 -- --arg1
dotnet test dotnet watch test

Чтобы запустить WebApp, запустите dotnet watch run в папке WebApp. В результате в консоли вы увидите схожие сообщения, где говорится, что dotnet watch сейчас просматривает файлы кода:

user$ dotnet watch run
[DotNetWatcher] info: Running dotnet with the following arguments: run
[DotNetWatcher] info: dotnet process id: 39746
Project WebApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Hosting environment: Production
Content root path: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

Внесение изменений с помощью dotnet watch

Убедитесь, что dotnet watch запущен.

Давайте исправим ошибку, которую мы нашли, когда пытались вычислить произведение двух чисел.

Откройте WebApp/Controllers/MathController.cs.

Мы специально допустили в коде ошибку.

    public static int Product(int a, int b)
    {
        // We have an intentional bug here
        // + should be *
        return a + b; 
    }

Исправьте код, заменив a + b на a * b.

Сохраните файл. В консоли вы увидите схожие сообщения, где говорится, что dotnet watch обнаружил изменение в файле и перезапустил приложение.

[DotNetWatcher] info: File changed: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/Controllers/MathController.cs
[DotNetWatcher] info: Running dotnet with the following arguments: run
[DotNetWatcher] info: dotnet process id: 39940
Project WebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling WebApp for .NETCoreApp,Version=v1.0
Compilation succeeded.
  0 Warning(s)
  0 Error(s)
Time elapsed 00:00:03.3312829

Hosting environment: Production
Content root path: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

Видите, http://localhost:5000/api/math/product?a=4&b=5 возвращает корректный результат.

Запуск тестов с помощью dotnet watch

dotnet watch может запускать другие dotnet команды, как test или publish.

  1. Откройте папку WebAppTests, где уже есть dotnet watch в project.json.
  2. Запустите dotnet watch test.

Если вы уже исправили ошибку в MathController, тогда вы увидите схожий результат, иначе тест провалится:

WebAppTests user$ dotnet watch test
[DotNetWatcher] info: Running dotnet with the following arguments: test
[DotNetWatcher] info: dotnet process id: 40193
Project WebApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Project WebAppTests (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
xUnit.net .NET CLI test runner (64-bit .NET Core osx.10.11-x64)
  Discovering: WebAppTests
  Discovered:  WebAppTests
  Starting:    WebAppTests
  Finished:    WebAppTests
=== TEST EXECUTION SUMMARY ===
   WebAppTests  Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.259s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.
[DotNetWatcher] info: dotnet exit code: 0
[DotNetWatcher] info: Waiting for a file to change before restarting dotnet...

После прохождения всех тестов, “watcher” скажет, что ожидает файловых изменений, прежде чем перезапустить dotnet test.

  1. Откройте файл контроллера в WebApp/Controllers/MathController.cs и внесите какие-нибудь изменения в код. Если вы не исправили ошибку, сделайте это сейчас. Сохраните файл.

dotnet watch определит изменения в файле и перезапустит тесты. В консоли вы увидите схожие сообщения:

[DotNetWatcher] info: File changed: /Users/user/dev/aspnet/Docs/aspnet/tutorials/dotnet-watch/sample/WebApp/Controllers/MathController.cs
[DotNetWatcher] info: Running dotnet with the following arguments: test
[DotNetWatcher] info: dotnet process id: 40233
Project WebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling WebApp for .NETCoreApp,Version=v1.0
Compilation succeeded.
  0 Warning(s)
  0 Error(s)
Time elapsed 00:00:03.2127590
Project WebAppTests (.NETCoreApp,Version=v1.0) will be compiled because dependencies changed
Compiling WebAppTests for .NETCoreApp,Version=v1.0
Compilation succeeded.
  0 Warning(s)
  0 Error(s)
Time elapsed 00:00:02.1204052

xUnit.net .NET CLI test runner (64-bit .NET Core osx.10.11-x64)
  Discovering: WebAppTests
  Discovered:  WebAppTests
  Starting:    WebAppTests
  Finished:    WebAppTests
=== TEST EXECUTION SUMMARY ===
   WebAppTests  Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.260s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.
[DotNetWatcher] info: dotnet exit code: 0

[DotNetWatcher] info: Waiting for a file to change before restarting dotnet...
Поделись хорошей новостью с друзьями!
Следи за новостями!