次の方法で共有


dotnet watch

この記事の対象: ✔️ .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 rundotnet build、またはdotnet testを実行できます。 <command>runbuild、または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 restoredotnet run からの出力は引き続き出力されます。

  • -v|--verbose

    デバッグ用の詳細出力を表示します。

  • --version

    dotnet watchのバージョンを表示します。

  • --

    二重ダッシュ オプション ('--') を使用すると、子プロセスに渡される引数からdotnet watchオプションを区切ることができます。 その使用は省略可能です。 二重ダッシュ オプションを使用しない場合、 dotnet watch は認識されない最初の引数を、子 dotnet プロセスに渡す必要がある引数の先頭と見なします。

  • -?|-h|--help

    コマンドの使用方法を示した説明を出力します。

環境変数

dotnet watch では、次の環境変数が使用されます。

  • DOTNET_HOTRELOAD_NAMEDPIPE_NAME

    この値は、アプリを起動するときに dotnet watch によって構成され、名前付きパイプを指定します。

  • DOTNET_USE_POLLING_FILE_WATCHER

    1またはtrueに設定すると、dotnet watchSystem.IO.FileSystemWatcherではなくポーリング ファイル ウォッチャーを使用します。 ポーリングは、ネットワーク共有、Docker マウント ボリューム、その他の仮想ファイル システムなど、一部のファイル システムに必要です。 PhysicalFileProvider クラスは、DOTNET_USE_POLLING_FILE_WATCHERを使用して、PhysicalFileProvider.Watch メソッドがPollingFileChangeTokenに依存するかどうかを判断します。

  • DOTNET_WATCH

    dotnet watch は、この変数を起動するすべての子プロセスで 1 に設定します。

  • DOTNET_WATCH_AUTO_RELOAD_WS_HOSTNAME

    dotnet watchの一部として、ブラウザー更新サーバー メカニズムはこの値を読み取って WebSocket ホスト環境を決定します。 値 127.0.0.1localhostに置き換えられ、 http:// スキームと https:// スキームはそれぞれ ws://wss:// に置き換えられます。

  • DOTNET_WATCH_ITERATION

    dotnet watch は、この変数を 1 に設定し、ファイルが変更され、コマンドがアプリケーションを再起動またはホット リロードするたびに 1 ずつインクリメントします。

  • DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH

    1または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_BROWSER

    1またはtrueに設定すると、dotnet watchは、launchSettings.jsonで構成されている web アプリのブラウザーlaunchBrowser起動または更新されません。

  • DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM

    既定では、 dotnet watch は、復元の実行や、すべてのファイル変更に対する監視対象ファイルのセットの再評価などの特定の操作を回避することで、ビルドを最適化します。 この変数が 1 または trueに設定されている場合、これらの最適化は無効になります。

  • DOTNET_WATCH_SUPPRESS_STATIC_FILE_HANDLING

    1またはtrueに設定すると、dotnet watchは静的コンテンツ ファイルに対して特別な処理を行いません。 dotnet watch は、MSBuild プロパティの DotNetWatchContentFilesfalseに設定します。

  • DOTNET_WATCH_RESTART_ON_RUDE_EDIT

    1または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
    

こちらも参照ください