dotnet watch
は、ソース ファイルが変更されたときに .NET CLI コマンドを実行するツールです。 たとえば、ファイルの変更によってコンパイル、テスト実行、またはデプロイがトリガーされる場合があります。
このチュートリアルでは、合計を返すエンドポイントと製品を返すエンドポイントの 2 つのエンドポイントを持つ既存の Web API を使用します。 製品メソッドにはバグがあり、このチュートリアルで修正されています。
サンプル アプリをダウンロードします。 WebApp (ASP.NET Core Web API) と WebAppTests (Web API の単体テスト) の 2 つのプロジェクトで構成されています。
コマンド シェルで、 WebApp フォルダーに移動します。 次のコマンドを実行します。
dotnet run
注
dotnet run --project <PROJECT>
を使用して、実行するプロジェクトを指定できます。 たとえば、サンプル アプリのルートから dotnet run --project WebApp
を実行すると、 WebApp プロジェクトも実行されます。
コンソール出力には、次のようなメッセージが表示されます (アプリが実行され、要求を待機していることを示します)。
$ 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.
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
を追加する
dotnet watch
ファイル 監視ツールは、.NET Core SDK のバージョン 2.1.300 に含まれています。 以前のバージョンの .NET Core SDK を使用する場合は、次の手順が必要です。
Microsoft.DotNet.Watcher.Tools
ファイルに.csproj
パッケージ参照を追加します。<ItemGroup> <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" /> </ItemGroup>
次のコマンドを実行して
Microsoft.DotNet.Watcher.Tools
パッケージをインストールします。dotnet restore
を使用して .NET CLI コマンドを実行する dotnet watch
.NET CLI コマンドは、dotnet watch
を使用して実行できます。 例えば次が挙げられます。
コマンド | ウォッチ付きコマンド |
---|---|
dotnet run | dotnet watch run(dotnetウォッチランコマンドを実行) |
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 テスト |
dotnet watch run
フォルダーでを実行します。 コンソール出力は watch
が開始したことを示します。
Web アプリで dotnet watch run
を実行すると、準備ができたらアプリの URL に移動するブラウザーが起動します。
dotnet watch
これを行うには、アプリのコンソール出力を読み取り、 WebHostによって表示される準備完了メッセージを待機します。
dotnet watch
は、監視対象のファイルへの変更を検出したときにブラウザーを更新します。 これを行うために、watch コマンドは、アプリによって作成された HTML 応答を変更するミドルウェアをアプリに挿入します。 ミドルウェアは、ページに JavaScript スクリプト ブロックを追加します。これにより、 dotnet watch
はブラウザーに更新を指示できます。 現在、 .html
ファイルや .css
ファイルなどの静的コンテンツを含む、すべての監視対象ファイルに対する変更により、アプリが再構築されます。
dotnet watch
:
- 既定では、ビルドに影響を与えるファイルのみを監視します。
- 追加で監視されたファイルは (構成を介して) 引き続きビルドが行われます。
構成の詳細については、このドキュメント の dotnet-watch 構成 を参照してください。
注
dotnet watch --project <PROJECT>
を使用して、監視するプロジェクトを指定できます。 たとえば、サンプル アプリのルートから dotnet watch --project WebApp run
を実行すると、 WebApp プロジェクトも実行され、監視されます。
を使用して変更を加えます。 dotnet watch
dotnet watch
が実行されていることを確認します。
Product
のMathController.cs
メソッドのバグを修正して、合計ではなく積を返すようにします。
public static int Product(int a, int b)
{
return a * b;
}
ファイルを保存します。 コンソール出力は、 dotnet watch
ファイルの変更を検出し、アプリを再起動したことを示します。
正しい結果 http://localhost:<port number>/api/math/product?a=4&b=5
返されていることを確認します。
を使用してテストを実行する dotnet watch
Product
のMathController.cs
メソッドを、合計を返すように変更します。 ファイルを保存します。コマンド シェルで、 WebAppTests フォルダーに移動します。
dotnet の復元を実行します。
dotnet watch test
を実行します。 その出力は、テストが失敗し、ウォッチャーがファイルの変更を待機していることを示します。Total tests: 2. Passed: 1. Failed: 1. Skipped: 0. Test Run Failed.
製品を返すように
Product
メソッド コードを修正します。 ファイルを保存します。
dotnet watch
はファイルの変更を検出し、テストを再実行します。 コンソール出力は、合格したテストを示します。
視聴するファイルの一覧をカスタマイズする
既定では、 dotnet-watch
は次の glob パターンに一致するすべてのファイルを追跡します。
**/*.cs
*.csproj
**/*.resx
- コンテンツ ファイル:
wwwroot/**
、**/*.config
、**/*.json
.csproj
ファイルを編集すると、ウォッチ リストにさらに項目を追加できます。 項目は、個別に指定することも、glob パターンを使用して指定することもできます。
<ItemGroup>
<!-- extends watching group to include *.js files -->
<Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
監視対象のファイルのオプトアウト
dotnet-watch
は、既定の設定を無視するように構成できます。 特定のファイルを無視するには、Watch="false"
ファイル内の項目の定義に.csproj
属性を追加します。
<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>
カスタム ウォッチ プロジェクト
dotnet-watch
は C# プロジェクトに限定されません。 カスタム ウォッチ プロジェクトは、さまざまなシナリオに対応するために作成できます。 次のプロジェクト レイアウトについて考えてみましょう。
-
試験/
UnitTests/UnitTests.csproj
IntegrationTests/IntegrationTests.csproj
両方のプロジェクトを監視することが目的の場合は、両方のプロジェクトを監視するように構成されたカスタム プロジェクト ファイルを作成します。
<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>
両方のプロジェクトでファイル監視を開始するには、 テスト フォルダーに変更します。 次のコマンドを実行します。
dotnet watch msbuild /t:Test
VSTest は、いずれかのテスト プロジェクトでファイルが変更されたときに実行されます。
dotnet-watch の構成
一部の構成オプションは、環境変数を使用して dotnet watch
に渡すことができます。 使用可能な変数は次のとおりです。
設定 | 説明 |
---|---|
DOTNET_USE_POLLING_FILE_WATCHER |
"1" または "true" に設定すると、 dotnet watch は CoreFx の FileSystemWatcher の代わりにポーリング ファイル ウォッチャーを使用します。 ネットワーク共有または Docker にマウントされたボリューム上のファイルを監視するときに使用されます。 |
DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM |
既定では、 dotnet watch は、復元の実行や、すべてのファイル変更に対する監視対象ファイルのセットの再評価などの特定の操作を回避することで、ビルドを最適化します。 "1" または "true" に設定すると、これらの最適化は無効になります。 |
DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER |
dotnet watch run は、launchBrowser で構成されたlaunchSettings.json を使用して Web アプリのブラウザーを起動しようとします。 "1" または "true" に設定すると、この動作は抑制されます。 |
DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH |
dotnet watch run は、ファイルの変更を検出したときにブラウザーの更新を試みます。 "1" または "true" に設定すると、この動作は抑制されます。 この動作は、 DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER が設定されている場合にも抑制されます。 |
ブラウザーの更新
dotnet watch
は、コンテンツが変更されたときにブラウザーを更新できるようにするスクリプトをアプリに挿入します。 アプリが応答圧縮を有効にする場合など、一部のシナリオでは、 dotnet watch
がスクリプトを挿入 できない 場合があります。 開発中のこのような場合は、スクリプトをアプリに手動で挿入します。 たとえば、スクリプトを手動で挿入するように Web アプリを構成するには、レイアウト ファイルを更新して _framework/aspnet-browser-refresh.js
を含めます。
@* _Layout.cshtml *@
<environment names="Development">
<script src="/_framework/aspnetcore-browser-refresh.js"></script>
</environment>
ASCII 以外の文字
Visual Studio 17.2 以降には、.NET SDK 6.0.300 以降が含まれています。 .NET SDK と 6.0.300 以降では、 dotnet-watch
はホット リロード セッション中に非 ASCII 文字をコンソールに出力します。 Windows conhost などの特定のコンソール ホストでは、これらの文字が文字化けして表示されることがあります。 文字化けしないようにするには、次のいずれかの方法を検討してください。
-
DOTNET_WATCH_SUPPRESS_EMOJIS=1
環境変数を構成して、これらの値の出力を抑制します。 - ASCII 以外の文字のレンダリングをサポートする別のターミナル ( https://github.com/microsoft/terminal など) に切り替えます。
ASP.NET Core