diff --git a/src/Microsoft.Tye.Core/HostOptions.cs b/src/Microsoft.Tye.Core/HostOptions.cs index 73135cfd..27e6e2f7 100644 --- a/src/Microsoft.Tye.Core/HostOptions.cs +++ b/src/Microsoft.Tye.Core/HostOptions.cs @@ -11,6 +11,7 @@ namespace Microsoft.Tye public bool Dashboard { get; set; } public List Debug { get; } = new List(); + public List Watch { get; } = new List(); public string? DistributedTraceProvider { get; set; } @@ -25,7 +26,5 @@ namespace Microsoft.Tye public int? Port { get; set; } public Verbosity LogVerbosity { get; set; } = Verbosity.Debug; - - public bool Watch { get; set; } } } diff --git a/src/Microsoft.Tye.Hosting/ProcessRunner.cs b/src/Microsoft.Tye.Hosting/ProcessRunner.cs index 4dc8f124..ae8fddb5 100644 --- a/src/Microsoft.Tye.Hosting/ProcessRunner.cs +++ b/src/Microsoft.Tye.Hosting/ProcessRunner.cs @@ -218,7 +218,7 @@ namespace Microsoft.Tye.Hosting application.PopulateEnvironment(service, (k, v) => environment[k] = v); - if (_options.DebugMode && (_options.DebugAllServices || _options.ServicesToDebug!.Contains(serviceName, StringComparer.OrdinalIgnoreCase))) + if (_options.ShouldDebugService(serviceName)) { environment["DOTNET_STARTUP_HOOKS"] = typeof(Hosting.Runtime.HostingRuntimeHelpers).Assembly.Location; } @@ -267,7 +267,7 @@ namespace Microsoft.Tye.Hosting status.StoppingTokenSource = stoppingCts; await using var _ = processInfo.StoppedTokenSource.Token.Register(() => status.StoppingTokenSource.Cancel()); - if (!_options.Watch) + if (!_options.ShouldWatchService(serviceName)) { service.Replicas[replica] = status; service.ReplicaEvents.OnNext(new ReplicaEvent(ReplicaState.Added, status)); @@ -327,7 +327,7 @@ namespace Microsoft.Tye.Hosting WriteReplicaToStore(pid.ToString()); - if (_options.Watch) + if (_options.ShouldWatchService(serviceName)) { // OnStart/OnStop will be called multiple times for watch. // Watch will constantly be adding and removing from the list, so only add here for watch. @@ -346,7 +346,7 @@ namespace Microsoft.Tye.Hosting service.ReplicaEvents.OnNext(new ReplicaEvent(ReplicaState.Stopped, status)); } - if (!_options.Watch) + if (!_options.ShouldWatchService(serviceName)) { // Only increase backoff when not watching project as watch will wait for file changes before rebuild. backOff *= 2; @@ -375,7 +375,7 @@ namespace Microsoft.Tye.Hosting } }; - if (_options.Watch && (service.Description.RunInfo is ProjectRunInfo runInfo)) + if (_options.ShouldWatchService(serviceName) && (service.Description.RunInfo is ProjectRunInfo runInfo)) { var projectFile = runInfo.ProjectFile.FullName; var fileSetFactory = new MsBuildFileSetFactory(_logger, @@ -387,7 +387,7 @@ namespace Microsoft.Tye.Hosting await new DotNetWatcher(_logger) .WatchAsync(processInfo, fileSetFactory, replica, status.StoppingTokenSource.Token); } - else if (_options.Watch && (service.Description.RunInfo is AzureFunctionRunInfo azureFunctionRunInfo) && !string.IsNullOrEmpty(azureFunctionRunInfo.ProjectFile)) + else if (_options.ShouldWatchService(serviceName) && (service.Description.RunInfo is AzureFunctionRunInfo azureFunctionRunInfo) && !string.IsNullOrEmpty(azureFunctionRunInfo.ProjectFile)) { var projectFile = azureFunctionRunInfo.ProjectFile; var fileSetFactory = new MsBuildFileSetFactory(_logger, @@ -408,7 +408,7 @@ namespace Microsoft.Tye.Hosting { _logger.LogError(0, ex, "Failed to launch process for service {ServiceName}", replica); - if (!_options.Watch) + if (!_options.ShouldWatchService(serviceName)) { // Only increase backoff when not watching project as watch will wait for file changes before rebuild. backOff *= 2; diff --git a/src/Microsoft.Tye.Hosting/ProcessRunnerOptions.cs b/src/Microsoft.Tye.Hosting/ProcessRunnerOptions.cs index 69981427..173f7dd3 100644 --- a/src/Microsoft.Tye.Hosting/ProcessRunnerOptions.cs +++ b/src/Microsoft.Tye.Hosting/ProcessRunnerOptions.cs @@ -9,21 +9,33 @@ namespace Microsoft.Tye.Hosting { public class ProcessRunnerOptions { - public bool DebugMode { get; set; } + public const string AllServices = "*"; + public bool BuildProjects { get; set; } + + public bool DebugMode { get; set; } public string[]? ServicesToDebug { get; set; } public bool DebugAllServices { get; set; } - public bool Watch { get; set; } + public bool ShouldDebugService (string serviceName) => DebugMode && (DebugAllServices || ServicesToDebug!.Contains(serviceName, StringComparer.OrdinalIgnoreCase)); + + public bool WatchMode { get; set; } + public string[]? ServicesToWatch { get; set; } + public bool WatchAllServices { get; set; } + public bool ShouldWatchService(string serviceName) => WatchMode && (WatchAllServices || ServicesToWatch!.Contains(serviceName, StringComparer.OrdinalIgnoreCase)); public static ProcessRunnerOptions FromHostOptions(HostOptions options) { return new ProcessRunnerOptions { BuildProjects = !options.NoBuild, + DebugMode = options.Debug.Any(), ServicesToDebug = options.Debug.ToArray(), - DebugAllServices = options.Debug?.Contains("*", StringComparer.OrdinalIgnoreCase) ?? false, - Watch = options.Watch + DebugAllServices = options.Debug?.Contains(AllServices, StringComparer.OrdinalIgnoreCase) ?? false, + + WatchMode = options.Watch.Any(), + ServicesToWatch = options.Watch.ToArray(), + WatchAllServices = options.Watch?.Contains(AllServices, StringComparer.OrdinalIgnoreCase) ?? false, }; } } diff --git a/src/tye/Program.RunCommand.cs b/src/tye/Program.RunCommand.cs index dd59e428..d4742d2a 100644 --- a/src/tye/Program.RunCommand.cs +++ b/src/tye/Program.RunCommand.cs @@ -111,9 +111,9 @@ namespace Microsoft.Tye LoggingProvider = args.Logs, MetricsProvider = args.Metrics, LogVerbosity = args.Verbosity, - Watch = args.Watch }; options.Debug.AddRange(args.Debug); + options.Watch.AddRange(args.Watch); await application.ProcessExtensionsAsync(options, output, ExtensionContext.OperationKind.LocalRun); @@ -170,7 +170,7 @@ namespace Microsoft.Tye public Verbosity Verbosity { get; set; } - public bool Watch { get; set; } + public string[] Watch { get; set; } = Array.Empty(); public string Framework { get; set; } = default!; diff --git a/test/E2ETest/TyeRunTests.cs b/test/E2ETest/TyeRunTests.cs index 09c09434..14d1ea44 100644 --- a/test/E2ETest/TyeRunTests.cs +++ b/test/E2ETest/TyeRunTests.cs @@ -19,7 +19,6 @@ using System.Text.Json; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Primitives; using Microsoft.Tye; using Microsoft.Tye.Hosting; using Microsoft.Tye.Hosting.Model; @@ -353,7 +352,10 @@ services: var client = new HttpClient(new RetryHandler(handler)); - await RunHostingApplication(application, new HostOptions() { Watch = true }, async (app, uri) => + var hostOptions = new HostOptions(); + hostOptions.Watch.Add(ProcessRunnerOptions.AllServices); + + await RunHostingApplication(application, hostOptions, async (app, uri) => { // make sure both are running var frontendUri = await GetServiceUrl(client, uri, "frontend"); @@ -404,7 +406,10 @@ services: var client = new HttpClient(new RetryHandler(handler)); - await RunHostingApplication(application, new HostOptions() { Watch = true }, async (app, uri) => + var hostOptions = new HostOptions(); + hostOptions.Watch.Add(ProcessRunnerOptions.AllServices); + + await RunHostingApplication(application, hostOptions, async (app, uri) => { // make sure app is running var appUri = await GetServiceUrl(client, uri, "web-app");