From fcd88be1bc1e46ef16ea3bd3cbf2622035b93b55 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Wed, 30 Jul 2025 13:01:10 +0200 Subject: [PATCH] Support hot reload for cshtml files --- Directory.Packages.props | 5 ++-- build/Targets.fs | 2 +- src/Directory.Build.props | 3 +- .../Elastic.Documentation.Site.csproj | 1 - .../Http/ReloadGeneratorService.cs | 30 +++++++++++++++++++ 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 4a9060035..ed9d3acb4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -2,6 +2,7 @@ true + true @@ -42,7 +43,7 @@ - + @@ -70,4 +71,4 @@ - + \ No newline at end of file diff --git a/build/Targets.fs b/build/Targets.fs index 49ad43ede..efc5f7852 100644 --- a/build/Targets.fs +++ b/build/Targets.fs @@ -34,7 +34,7 @@ let private version _ = let private format _ = exec { run "dotnet" "format" "--verbosity" "quiet" } -let private watch _ = exec { run "dotnet" "watch" "--project" "src/tooling/docs-builder" "--no-hot-reload" "--" "serve" } +let private watch _ = exec { run "dotnet" "watch" "--project" "src/tooling/docs-builder" "--configuration" "debug" "--" "serve" } let private lint _ = match exec { diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 44c6f4409..df20443f0 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -9,5 +9,6 @@ true + true - \ No newline at end of file + diff --git a/src/Elastic.Documentation.Site/Elastic.Documentation.Site.csproj b/src/Elastic.Documentation.Site/Elastic.Documentation.Site.csproj index c8222af4c..c8b68628d 100644 --- a/src/Elastic.Documentation.Site/Elastic.Documentation.Site.csproj +++ b/src/Elastic.Documentation.Site/Elastic.Documentation.Site.csproj @@ -10,7 +10,6 @@ true $(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated true - true diff --git a/src/tooling/docs-builder/Http/ReloadGeneratorService.cs b/src/tooling/docs-builder/Http/ReloadGeneratorService.cs index 30a0af437..fdc34e2e8 100644 --- a/src/tooling/docs-builder/Http/ReloadGeneratorService.cs +++ b/src/tooling/docs-builder/Http/ReloadGeneratorService.cs @@ -6,8 +6,24 @@ using Microsoft.Extensions.Logging; using Westwind.AspNetCore.LiveReload; +[assembly: System.Reflection.Metadata.MetadataUpdateHandler(typeof(Documentation.Builder.Http.HotReloadManager))] + namespace Documentation.Builder.Http; +public static class HotReloadManager +{ + public static void ClearCache(Type[]? _) => LiveReloadMiddleware.RefreshWebSocketRequest(); + + public static void UpdateApplication(Type[]? _) => Task.Run(async () => + { + await Task.Delay(1000); + var __ = LiveReloadMiddleware.RefreshWebSocketRequest(); + Console.WriteLine("UpdateApplication"); + }); + +} + + public sealed class ReloadGeneratorService(ReloadableGeneratorState reloadableGenerator, ILogger logger) : IHostedService, IDisposable { private FileSystemWatcher? _watcher; @@ -22,6 +38,9 @@ public async Task StartAsync(Cancel cancellationToken) await ReloadableGenerator.ReloadAsync(cancellationToken); var directory = ReloadableGenerator.Generator.DocumentationSet.SourceDirectory.FullName; +#if DEBUG + directory = ReloadableGenerator.Generator.Context.DocumentationCheckoutDirectory?.FullName ?? throw new InvalidOperationException("No checkout directory"); +#endif Logger.LogInformation("Start file watch on: {Directory}", directory); var watcher = new FileSystemWatcher(directory) { @@ -40,6 +59,9 @@ public async Task StartAsync(Cancel cancellationToken) watcher.Renamed += OnRenamed; watcher.Error += OnError; +#if DEBUG + watcher.Filters.Add("*.cshtml"); +#endif watcher.Filters.Add("*.md"); watcher.Filters.Add("docset.yml"); watcher.IncludeSubdirectories = true; @@ -73,6 +95,10 @@ private void OnChanged(object sender, FileSystemEventArgs e) Reload(); if (e.FullPath.EndsWith(".md")) Reload(); +#if DEBUG + if (e.FullPath.EndsWith(".cshtml")) + _ = LiveReloadMiddleware.RefreshWebSocketRequest(); +#endif } @@ -97,6 +123,10 @@ private void OnRenamed(object sender, RenamedEventArgs e) Logger.LogInformation(" New: {NewFullPath}", e.FullPath); if (e.FullPath.EndsWith(".md")) Reload(); +#if DEBUG + if (e.FullPath.EndsWith(".cshtml")) + _ = LiveReloadMiddleware.RefreshWebSocketRequest(); +#endif } private void OnError(object sender, ErrorEventArgs e) =>