使用文件观察程序开发 ASP.NET Core 应用Develop ASP.NET Core apps using a file watcher

本文内容

作者:Rick AndersonVictor Hurdugaci

dotnet watch 是一种在源文件更改时运行 .NET Core CLI 命令的工具。例如,文件更改可能触发编译、测试执行或部署。

本教程使用一个现有 Web API 和两个终结点:分别返回两个数的总和以及乘积。乘积的方法有一个 bug,本教程将会对其进行修复。

下载示例应用它包含两个项目:WebApp (ASP.NET Core Web API) 和 WebAppTests (用于 Web API 的单元测试)。

在命令行界面中,导航到 WebApp 文件夹 。运行下面的命令:

  1. dotnet run

备注

可使用 dotnet run —project <PROJECT> 来指定要运行的项目。例如,从示例应用的根路径运行 dotnet run —project WebApp 还会运行 WebApp 项目。

控制台输出会显示如下类似的消息(表示应用正在运行且正在等待请求):

  1. $ dotnet run
  2. Hosting environment: Development
  3. Content root path: C:/Docs/aspnetcore/tutorials/dotnet-watch/sample/WebApp
  4. Now listening on: http://localhost:5000
  5. Application started. Press Ctrl+C to shut down.

在 Web 浏览器中,导航到 http://localhost:<port number>/api/math/sum?a=4&b=5应该会显示结果 9

导航到产品 API (http://localhost:<port number>/api/math/product?a=4&b=5)。它会返回 9,而不是所预期的 20本教程的后面部分将解决该问题。

将 dotnet watch 添加到项目Add dotnet watch to a project

dotnet watch 文件观察程序工具随 2.1.300 版本的 .NET Core SDK 一同提供。使用早期版本的 .NET Core SDK 时,需要执行以下步骤。

  • Microsoft.DotNet.Watcher.Tools 包引用添加到 .csproj 文件 :
  1. <ItemGroup>
  2. <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
  3. </ItemGroup>
  • 运行以下命令,安装 Microsoft.DotNet.Watcher.Tools 包:
  1. dotnet restore

使用 dotnet watch 运行 .NET Core CLI 命令Run .NET Core CLI commands using dotnet watch

dotnet watch 可用于运行任何 .NET Core CLI 命令例如:

命令带 watch 的命令
dotnet rundotnet watch run
dotnet run -f netcoreapp2.0dotnet watch run -f netcoreapp2.0
dotnet run -f netcoreapp2.0 — —arg1dotnet watch run -f netcoreapp2.0 — —arg1
dotnet testdotnet watch test

运行“WebApp”文件夹中的 dotnet watch run控制台输出指示 watch 已启动。

备注

可使用 dotnet watch —project <PROJECT> 来指定要监视的项目。例如,从示例应用的根路径运行 dotnet watch —project WebApp run 还会运行并监视 WebApp 项目。

使用 dotnet watch 执行更改Make changes with dotnet watch

确保 dotnet watch 正在运行。

修复 MathController 的 Product 方法中的 bug,使其返回乘积而非总和 。

  1. public static int Product(int a, int b)
  2. {
  3. return a * b;
  4. }

保存该文件。控制台输出指示 dotnet watch 已检测到文件更改并已重启应用。

验证 http://localhost:<port number>/api/math/product?a=4&b=5 是否返回正确结果。

使用 dotnet watch 运行测试Run tests using dotnet watch

  • 将 MathController.cs 的 Product 方法改回返回总和 。保存该文件。

  • 在命令外壳中,导航到“WebAppTests”文件夹 。

  • 运行 dotnet restore

  • 运行 dotnet watch test。其输出指示测试失败且观察程序正在等待文件更改:

  1. Total tests: 2. Passed: 1. Failed: 1. Skipped: 0.
  2. Test Run Failed.
  • 修复 Product 方法代码,使其返回乘积。保存该文件。

dotnet watch 检测到文件更改并重新运行测试。控制台输出指示测试通过。

自定义要监视的文件列表Customize files list to watch

默认情况下,dotnet-watch 跟踪与以下 glob 模式匹配的所有文件:

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

通过编辑 .csproj 文件,可向监视列表添加更多项 。可以单独指定项或使用 glob 模式指定。

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

从要监视的文件中排除Opt-out of files to be watched

dotnet-watch 可配置为忽略其默认设置。要忽略特定文件,请在 .csproj 文件中向某项的定义中添加 Watch="false" 特性 :

  1. <ItemGroup>
  2. <!-- exclude Generated.cs from dotnet-watch -->
  3. <Compile Include="Generated.cs" Watch="false" />
  4. <!-- exclude Strings.resx from dotnet-watch -->
  5. <EmbeddedResource Include="Strings.resx" Watch="false" />
  6. <!-- exclude changes in this referenced project -->
  7. <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
  8. </ItemGroup>

自定义监视项目Custom watch projects

dotnet-watch 不仅限于 C# 项目。可以创建自定义监视项目来处理不同的方案。假设项目布局如下:

  • test/
    • UnitTests/UnitTests.csproj
    • IntegrationTests/IntegrationTests.csproj

如果目标是监视这两个项目,请创建配置为监视这两个项目的自定义项目文件:

  1. <Project>
  2. <ItemGroup>
  3. <TestProjects Include="**\*.csproj" />
  4. <Watch Include="**\*.cs" />
  5. </ItemGroup>
  6. <Target Name="Test">
  7. <MSBuild Targets="VSTest" Projects="@(TestProjects)" />
  8. </Target>
  9. <Import Project="$(MSBuildExtensionsPath)\Microsoft.Common.targets" />
  10. </Project>

要对这两个项目启动文件监视,请更改为 test 文件夹 。请执行以下命令:

  1. dotnet watch msbuild /t:Test

当任一测试项目中的任何文件发生更改时,将会执行 VSTest。

GitHub 中的 dotnet-watchdotnet-watch in GitHub

dotnet-watch 是 GitHub dotnet/AspNetCore 存储库的一部分。