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); }
public void Start(int port, string workingDirectory) { _server = new ScriptGenerationServer(_service, port, _loggerFactory); _server.Start(); }