この記事の対象: ✔️ .NET 6 SDK 以降のバージョン
名前
              dotnet watch - ソース コードの変更が検出されると、指定したアプリケーションを再起動または ホット リロード するか、指定した dotnet コマンドを実行します。
概要
dotnet watch [<command>]
  [--artifacts-path <ARTIFACTS_DIR>] [--disable-build-servers]
  [--list] [--no-hot-reload] [--no-self-contained]
  [--non-interactive] [--project <PROJECT>] [--sc|--self-contained]
  [-q|--quiet] [-v|--verbose] [--version]
  [--] <forwarded arguments> 
dotnet watch -?|-h|--help
Description
              dotnet watch コマンドはファイル ウォッチャーです。 変更が検出されると、 dotnet run コマンドまたは指定した dotnet コマンドが実行されます。 
              dotnet run実行され、ホット リロードで変更がサポートされている場合は、指定されたアプリケーションがホット リロードされます。 変更がサポートされていない場合は、アプリケーションを再起動します。 このプロセスにより、コマンド ラインからの高速な反復開発が可能になります。
              dotnet watchの実行中に、コマンド シェルで Ctrl キーを押しながら R キーを押して、アプリのリビルドと再起動を強制できます。 この機能は、アプリの実行中にのみ使用できます。 たとえば、Ctrl キーを押しながら R キーを押す前に終了するコンソール アプリで dotnet watch を実行した場合、Ctrl キーを押しながら R キーを押しても効果はありません。 ただし、その場合 dotnet watch はまだファイルを監視しており、ファイルが更新されるとアプリが再起動されます。
応答圧縮
              応答圧縮を使用するアプリに対して実行dotnet watch場合、ツールはブラウザー更新スクリプトを挿入できません。 .NET 7 以降のバージョンのツールには、次のような警告メッセージが表示されます。
warn: Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware[4]
応答でブラウザー更新スクリプトの挿入を構成できません。 これは、応答の Content-Encoding: 'br' が原因である可能性があります。 応答圧縮を無効にすることを検討してください。
応答圧縮を無効にする代わりに、ブラウザーの更新 JavaScript 参照をアプリのページに手動で追加します。
@if (Environment.GetEnvironmentVariable("__ASPNETCORE_BROWSER_TOOLS") is not null)
{
    <script src="/_framework/aspnetcore-browser-refresh.js"></script>
}
論争
<command>.NET 7 SDK 以前では、
dotnet watch組み込みの CLI コマンドやグローバル ツールなど、dotnet実行可能ファイルを介してディスパッチされた任意のコマンドを実行できます。dotnet <command>を実行できる場合は、dotnet watch <command>を実行できます。.NET 8 SDK 以降では、
dotnet watchdotnet run、dotnet build、またはdotnet testを実行できます。<command>のrun、build、またはtestを指定します。子コマンドが指定されていない場合、
dotnet runの既定値はrun。<forwarded arguments>二重ダッシュ (
--) の後に指定された引数は、子dotnetプロセスに渡されます。dotnet watch runを実行している場合、これらの引数は dotnet 実行のオプションです。dotnet watch testを実行している場合、これらの引数は dotnet テストのオプションです。
オプション
--artifacts-path <ARTIFACTS_DIR>実行されたコマンドからのすべてのビルド出力ファイルは、指定されたパスの下のサブフォルダーに配置され、プロジェクトで区切られます。 詳細については、「 Artifacts 出力レイアウトを参照してください。 .NET 8 SDK 以降で利用可能です。
--disable-build-servers永続的なビルド サーバーを無視するようにコマンドを強制します。 このオプションは、ビルド キャッシュのすべての使用を無効にする一貫した方法を提供します。これにより、ビルドが最初から強制的に実行されます。 キャッシュに依存しないビルドは、何らかの理由でキャッシュが破損している、または正しくない可能性がある場合に便利です。 .NET 7 SDK 以降で使用できます。
--listウォッチャーを起動せずに、検出されたすべてのファイルを一覧表示します。
--no-self-contained--self-contained falseに相当します。
--no-hot-reloadサポートされているアプリのホット リロードを抑制します。
--non-interactive非対話型モードで
dotnet watchを実行します。 コンソール入力が要求されないようにするには、このオプションを使用します。 ホット リロードが有効になっていて、 失礼な編集 が検出されると、dotnet watch によってアプリが再起動されます。 .NET 7 SDK 以降で使用できます。--project <PATH>実行するプロジェクト ファイルのパスを指定します (フォルダーのみ、またはプロジェクト ファイル名を含めます)。 指定しない場合は、既定で現在のディレクトリに設定されます。
--sc|--self-containedターゲット コンピューターにランタイムをインストールする必要がないように、アプリケーションで .NET ランタイムを発行します。 既定値は
trueです。
-q|--quiet警告とエラーを除き、
dotnet watchコマンドによって生成されるすべての出力を抑制します。 このオプションは子コマンドに渡されません。 たとえば、dotnet restoreとdotnet runからの出力は引き続き出力されます。-v|--verboseデバッグ用の詳細出力を表示します。
--versiondotnet watchのバージョンを表示します。--二重ダッシュ オプション ('--') を使用すると、子プロセスに渡される引数から
dotnet watchオプションを区切ることができます。 その使用は省略可能です。 二重ダッシュ オプションを使用しない場合、dotnet watchは認識されない最初の引数を、子dotnetプロセスに渡す必要がある引数の先頭と見なします。
-?|-h|--helpコマンドの使用方法を示した説明を出力します。
環境変数
              dotnet watch では、次の環境変数が使用されます。
DOTNET_HOTRELOAD_NAMEDPIPE_NAMEこの値は、アプリを起動するときに
dotnet watchによって構成され、名前付きパイプを指定します。DOTNET_USE_POLLING_FILE_WATCHER1またはtrueに設定すると、dotnet watchはSystem.IO.FileSystemWatcherではなくポーリング ファイル ウォッチャーを使用します。 ポーリングは、ネットワーク共有、Docker マウント ボリューム、その他の仮想ファイル システムなど、一部のファイル システムに必要です。 PhysicalFileProvider クラスは、DOTNET_USE_POLLING_FILE_WATCHERを使用して、PhysicalFileProvider.Watch メソッドがPollingFileChangeTokenに依存するかどうかを判断します。DOTNET_WATCHdotnet watchは、この変数を起動するすべての子プロセスで1に設定します。DOTNET_WATCH_AUTO_RELOAD_WS_HOSTNAMEdotnet watchの一部として、ブラウザー更新サーバー メカニズムはこの値を読み取って WebSocket ホスト環境を決定します。 値127.0.0.1はlocalhostに置き換えられ、http://スキームとhttps://スキームはそれぞれws://とwss://に置き換えられます。DOTNET_WATCH_ITERATIONdotnet watchは、この変数を1に設定し、ファイルが変更され、コマンドがアプリケーションを再起動またはホット リロードするたびに 1 ずつインクリメントします。DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH1またはtrueに設定すると、dotnet watchはファイルの変更を検出したときにブラウザーを更新しません。DOTNET_WATCH_SUPPRESS_EMOJIS.NET SDK 6.0.300 以降では、次の例に示すように、
dotnet watchは非 ASCII 文字をコンソールに出力します。dotnet watch 🔥 Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload. 💡 Press "Ctrl + R" to restart. dotnet watch 🔧 Building... dotnet watch 🚀 Started dotnet watch ⌚ Exited dotnet watch ⏳ Waiting for a file to change before restarting dotnet...特定のコンソール ホストでは、これらの文字が文字化けして表示されることがあります。 文字化けしないようにするには、この変数を
1またはtrueに設定します。DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER1またはtrueに設定すると、dotnet watchは、launchSettings.jsonで構成されている web アプリのブラウザーlaunchBrowser起動または更新されません。DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM既定では、
dotnet watchは、復元の実行や、すべてのファイル変更に対する監視対象ファイルのセットの再評価などの特定の操作を回避することで、ビルドを最適化します。 この変数が1またはtrueに設定されている場合、これらの最適化は無効になります。DOTNET_WATCH_SUPPRESS_STATIC_FILE_HANDLING1またはtrueに設定すると、dotnet watchは静的コンテンツ ファイルに対して特別な処理を行いません。dotnet watchは、MSBuild プロパティのDotNetWatchContentFilesをfalseに設定します。DOTNET_WATCH_RESTART_ON_RUDE_EDIT1またはtrueに設定すると、dotnet watchは常に、質問するのではなく、失礼な編集を再開します。
既定で監視されるファイル
              dotnet watch は、プロジェクト ファイル内の Watch 項目グループ内のすべての項目を監視します。 既定では、このグループには、 Compile グループと EmbeddedResource グループ内のすべての項目が含まれます。 
              dotnet watch また、プロジェクト参照のグラフ全体をスキャンし、それらのプロジェクト内のすべてのファイルを監視します。
既定では、 Compile グループと EmbeddedResource グループには、次の glob パターンに一致するすべてのファイルが含まれます。
**/*.cs*.csproj**/*.resx- Web アプリのコンテンツ ファイル: 
wwwroot/** 
既定では、 .configファイルと .json ファイルは、構成システムに構成変更を処理するための独自のメカニズムがあるため、dotnet watch の再起動をトリガーしません。
ファイルは、ウォッチ リストに追加することも、プロジェクト ファイルを編集してリストから削除することもできます。 ファイルは個別に指定することも、glob パターンを使用して指定することもできます。
その他のファイルを視聴する
              Watch グループに項目を追加することで、さらに多くのファイルを監視できます。 たとえば、次のマークアップは、そのグループを拡張して JavaScript ファイルを含めます。
<ItemGroup>
  <Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>
指定したファイルを無視する
              dotnet watchは、次の例に示すように、Watch="false"属性を持つCompileおよびEmbeddedResource項目を無視します。
<ItemGroup>
  <Compile Update="Generated.cs" Watch="false" />
  <EmbeddedResource Update="Strings.resx" Watch="false" />
</ItemGroup>
              dotnet watch では、次の例に示すように、 Watch="false" 属性を持つプロジェクト参照は無視されます。
<ItemGroup>
  <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>
詳細な構成
              dotnet watch は、デザイン時のビルドを実行して、監視する項目を検索します。 このビルドを実行すると、 dotnet watch プロパティの DotNetWatchBuild=trueが設定されます。 このプロパティは、次の例に示すように使用できます。
<ItemGroup Condition="'$(DotNetWatchBuild)'=='true'">
  <!-- only included in the project when dotnet-watch is running -->
</ItemGroup>
ホット リロード
.NET 6 SDK 以降では、dotnet watchホット リロードのサポートが含まれています。 ホット リロードは、リビルドして再起動することなく、実行中のアプリに変更を適用できる機能です。 変更は、コード ファイルまたは静的アセット (スタイルシート ファイルや JavaScript ファイルなど) に対して行われる場合があります。 この機能により、アプリを変更するときにすぐにフィードバックが提供されるため、ローカル開発エクスペリエンスが合理化されます。
ホット リロードをサポートするアプリの種類と .NET バージョンについては、「 サポートされている .NET アプリ フレームワークとシナリオ」を参照してください。
失礼な編集
ファイルが変更されると、 dotnet watch はアプリをホット リロードできるかどうかを判断します。 ホット リロードできない場合、変更は 失礼な編集 と呼ばれ、 dotnet watch はアプリを再起動するかどうかを確認します。
dotnet watch ⌚ Unable to apply hot reload because of a rude edit.
  ❔ Do you want to restart your app - Yes (y) / No (n) / Always (a) / Never (v)?
- はい: アプリを再起動します。
 - いいえ: 変更を適用せずにアプリを実行状態のままにします。
 - 常に:アプリを再起動し、失礼な編集を求めなくなりました。
 - なし: 変更を適用せずにアプリを実行した状態にし、失礼な編集を求めるメッセージが表示されなくなります。
 
失礼な編集と見なされる変更の種類については、「 コードを編集し、デバッグを続行し 、 コードに対するサポートされていない変更」を参照してください。
              dotnet watchの実行時にホット リロードを無効にするには、次の例に示すように、--no-hot-reload オプションを使用します。
dotnet watch --no-hot-reload 
例示
ソース コードが変更されるたびに、現在のディレクトリ内のプロジェクトの
dotnet runを実行します。dotnet watchまたは:
dotnet watch runソース コードが変更されるたびに、現在のディレクトリ内のプロジェクトの
dotnet testを実行します。dotnet watch testソース コードが変更されるたびに
dotnet run --project ./HelloWorld.csprojを実行します。dotnet watch run --project ./HelloWorld.csprojソース コードが変更されるたびに、現在のディレクトリ内のプロジェクトの
dotnet run -- arg0を実行します。dotnet watch run -- arg0または:
dotnet watch -- run arg0
こちらも参照ください
.NET