Exemple #1
0
        public static int Main()
        {
            // Parse arguments.
            var args = ArgumentParser.Parse(
                QuoteAwareStringSplitter
                .Split(EnvironmentHelper.GetCommandLine())
                .Skip(1));

            if (args.ContainsKey(Constants.CommandLine.Debug))
            {
                Console.WriteLine($"Attach debugger to process {Process.GetCurrentProcess().Id} to continue. ..");
                while (!Debugger.IsAttached)
                {
                    Thread.Sleep(100);
                }
            }

            // Validate the port argument.
            if (!args.ContainsKey(Constants.CommandLine.Port) ||
                !int.TryParse(args[Constants.CommandLine.Port], out int port))
            {
                throw new ArgumentException("Port not specified or invalid.");
            }

            var loggerFactory = new LoggerFactory();

            if (args.ContainsKey(Constants.CommandLine.Verbose))
            {
                loggerFactory.AddProvider(new LoggerProvider());
            }

            var registrar = new ContainerRegistrar();

            registrar.RegisterModule(new CoreModule());
            registrar.RegisterModule(new BakeryModule(loggerFactory));

            // Build the container.
            using (var container = registrar.Build())
            {
                var fileSystem            = container.Resolve <IFileSystem>();
                var log                   = container.Resolve <ICakeLog>();
                var configurationProvider = container.Resolve <CakeConfigurationProvider>();
                var workingDirectory      = new DirectoryPath(System.IO.Directory.GetCurrentDirectory());

                var configuration = configurationProvider.CreateConfiguration(workingDirectory, args);

                // Rebuild the container for NuGet and Buffered File System.
                registrar = new ContainerRegistrar();
                registrar.RegisterInstance(configuration);
                registrar.RegisterModule(new NuGetModule(configuration));
                registrar.RegisterModule(new ScriptingModule(fileSystem, log));
                registrar.Builder.Update(container);

                var environment            = container.Resolve <ICakeEnvironment>();
                var aliasFinder            = container.Resolve <IScriptAliasFinder>();
                var processor              = container.Resolve <Core.Scripting.IScriptProcessor>();
                var aliasGenerator         = container.Resolve <ICakeAliasGenerator>();
                var loadDirectiveProviders = container.Resolve <IEnumerable <ILoadDirectiveProvider> >();

                // Rebuild the container for Cached Alias Finder.
                registrar = new ContainerRegistrar();
                registrar.RegisterModule(new CacheModule(aliasFinder, processor, environment, aliasGenerator, loadDirectiveProviders));
                registrar.Builder.Update(container);

                // Get Script generator.
                var scriptGenerator = container.Resolve <IScriptGenerationService>();

                environment.WorkingDirectory = workingDirectory;

                try
                {
                    using (var server = new ScriptGenerationServer(scriptGenerator, port, loggerFactory))
                    {
                        server.Start();

                        var cancel = new ManualResetEvent(false);

                        server.OnDisconnected  += (sender, e) => { cancel.Set(); };
                        Console.CancelKeyPress += (sender, e) =>
                        {
                            cancel.Set();
                            e.Cancel = true;
                        };

                        cancel.WaitOne();
                        server.Stop();
                    }
                }
                catch (Exception e)
                {
                    loggerFactory.CreateLogger <Program>().LogCritical(0, e, "Unhandled Exception");
                    throw;
                }
            }

            return(0);
        }
Exemple #2
0
 public void Start(int port, string workingDirectory)
 {
     _server = new ScriptGenerationServer(_service, port, _loggerFactory);
     _server.Start();
 }