コード例 #1
0
        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));
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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();
        }