public static IDisposable Subscribe(this Pipeline pipeline, WorkerQueue worker) { var targets = string.Join(", ", pipeline.TargetModules.Select(v => v.Name)); Console.WriteLine($" * {pipeline.Name} => {targets}"); return(pipeline .Source .SelectMany(v => v.Operations) .Subscribe(worker.Add)); }
private static IEnumerable <IDisposable> DiscoverWatches(WorkerQueue worker, string[] moduleLocations, Target[] additionalTargets, string[] workingFolders) { var modules = new List <Module>(); foreach (var moduleLocation in moduleLocations) { Console.WriteLine("Discovering modules at: " + moduleLocation); modules.AddRange(FindModules(moduleLocation)); } Console.WriteLine($"Autodiscovered {modules.Count} modules."); // first pass, cull any modules not provided by working directories List <string> workingModules = new List <string>(); foreach (var workingFolder in workingFolders) { var sourceModule = modules.FirstOrDefault(v => v.Name == workingFolder); if (sourceModule == null) { continue; } workingModules.AddRange(sourceModule.Provides); } foreach (var module in modules) { foreach (var providedModule in module.Provides.ToList()) { if (!workingModules.Contains(providedModule)) { module.Provides.Remove(providedModule); } } foreach (var requiresModule in module.Requires.ToList()) { if (!workingModules.Contains(requiresModule)) { module.Requires.Remove(requiresModule); } } } Console.WriteLine("Setting up module pipelines for modules in working set:"); // figure out dependencies and set up watches foreach (var workingDirectory in workingFolders) { var sourceModule = modules.FirstOrDefault(v => v.Name == workingDirectory); if (sourceModule == null) { continue; } //Console.WriteLine($"{sourceModule.Name}"); //Console.WriteLine($" * Provides: {String.Join(",", sourceModule.Provides)}"); //Console.WriteLine($" * Requires: {String.Join(",", sourceModule.Requires)}"); // find modules which require anything this module provides var targetModules = modules .Where(t => sourceModule.Provides.Any(s => t.Requires.Contains(s))) .Where(t => workingFolders.Contains(t.Name)) .ToList(); // set up watches. yield return(Shuffle .Pipeline(workingDirectory) .From(sourceModule) .To(targetModules.OfType <PipelineObject>().ToArray()) .To(additionalTargets.OfType <PipelineObject>().ToArray()) .Subscribe(worker)); } }
static void Main(string[] args) { var banner = @" ██████ ██░ ██ █ ██ █████▒ █████▒██▓ ▓█████ ▒██ ▒ ▓██░ ██▒ ██ ▓██▒▓██ ▒▓██ ▒▓██▒ ▓█ ▀ ░ ▓██▄ ▒██▀▀██░▓██ ▒██░▒████ ░▒████ ░▒██░ ▒███ ▒ ██▒░▓█ ░██ ▓▓█ ░██░░▓█▒ ░░▓█▒ ░▒██░ ▒▓█ ▄ ▒██████▒▒░▓█▒░██▓▒▒█████▓ ░▒█░ ░▒█░ ░██████▒░▒████▒ ▒ ▒▓▒ ▒ ░ ▒ ░░▒░▒░▒▓▒ ▒ ▒ ▒ ░ ▒ ░ ░ ▒░▓ ░░░ ▒░ ░ ░ ░▒ ░ ░ ▒ ░▒░ ░░░▒░ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░"; Console.WriteLine("Lets play the ADERANT"); Console.WriteLine(); Console.WriteLine(banner); Console.WriteLine(); var moduleLocations = new string[] { @"c:\Source", @"C:\tfs\ExpertSuite\Dev\vnext\Modules" }; var additionalTargets = new Target[] { new Target("ExpertShare", @"c:\expertshare"), new Target("SharedBin", @"C:\AderantExpert\Local\SharedBin") }; var workingFolders = new string[] { "Framework", "Presentation", "Customization", "Services.Applications.FirmControl", "Services.Query" }; var worker = new WorkerQueue(); IDisposable watches = new CompositeDisposable(DiscoverWatches(worker, moduleLocations, additionalTargets, workingFolders)); worker.Start(); bool quit = false; while (!quit) { Console.WriteLine("Listening for changes... (f) Regenerate factory, (q) to quit."); var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Q) { Console.WriteLine("Cleaning up and quiting."); quit = true; } if (key.Key == ConsoleKey.F) { Console.WriteLine("Regenerate factory for (e) ExpertShare (s) SharedBin or (b) Both?"); var choice = Console.ReadKey(true); if (choice.Key == ConsoleKey.E || choice.Key == ConsoleKey.B) { RegenerateFactory(@"c:\ExpertShare"); } if (choice.Key == ConsoleKey.S || choice.Key == ConsoleKey.B) { RegenerateFactory(@"c:\AderantExpert\Local\SharedBin"); } } } watches.Dispose(); worker.Stop(); }