private static void InitializeLogger() { // Here a method had been used that was marked as obsolete in Microsoft.Extensions.Logging 2.2 // and has been removed in version 3.0 -> this is the workaround for it. // Refactoring the whole thing to make use of dependencyInjection will become necessary at some // point in the future. var configureNamedOptions = new ConfigureNamedOptions <ConsoleLoggerOptions>("", null); var postConfigureOptions = Enumerable.Empty <IPostConfigureOptions <ConsoleLoggerOptions> >(); var setups = new [] { configureNamedOptions }; var optionsFactory = new OptionsFactory <ConsoleLoggerOptions>(setups, postConfigureOptions); var optionsChangeTokenSources = Enumerable.Empty <IOptionsChangeTokenSource <ConsoleLoggerOptions> >(); var optionsMonitorCache = new OptionsCache <ConsoleLoggerOptions>(); var optionsMonitor = new OptionsMonitor <ConsoleLoggerOptions>(optionsFactory, optionsChangeTokenSources, optionsMonitorCache); var loggerFilterOptions = new LoggerFilterOptions { MinLevel = LogLevel.Debug }; var consoleLoggerProvider = new ConsoleLoggerProvider(optionsMonitor); var loggerFactory = new LoggerFactory(new[] { consoleLoggerProvider }, loggerFilterOptions); ApplicationLogging.LoggerFactory = loggerFactory; Logger = ApplicationLogging.CreateLogger("Program"); }
private static void Run(List <string> messageDirs, List <string> assemblies = null, string outputdir = null, bool interactive = false, string configuration = "Debug", string projectName = "Messages") { var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider( new ConsoleLoggerProvider( (string text, LogLevel logLevel) => { return(logLevel >= LogLevel.Debug); }, true) ); ApplicationLogging.LoggerFactory = loggerFactory; Logger = ApplicationLogging.CreateLogger("Program"); string yamlparser_parent = ""; DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory()); while (di != null && di.Name != "YAMLParser") { di = Directory.GetParent(di.FullName); } if (di == null) { throw new InvalidOperationException("Not started from within YAMLParser directory."); } di = Directory.GetParent(di.FullName); yamlparser_parent = di.FullName; if (outputdir == null) { outputdir = yamlparser_parent; outputdir = Path.Combine(outputdir, DEFAULT_OUTPUT_FOLDERNAME); } Templates.LoadTemplateStrings(Path.Combine(yamlparser_parent, "YAMLParser", "TemplateProject")); MessageTypeRegistry.Default.ParseAssemblyAndRegisterRosMessages(MessageTypeRegistry.Default.GetType().GetTypeInfo().Assembly); if (assemblies != null) { string hints = ""; foreach (var assembly in assemblies) { var rosNetMessages = Assembly.LoadFile(Path.GetFullPath(assembly)); MessageTypeRegistry.Default.ParseAssemblyAndRegisterRosMessages(rosNetMessages); hints += $@" <ItemGroup> <Reference Include=""Messages""> <HintPath>{assembly}</HintPath> </Reference> </ItemGroup> "; } Templates.MessagesProj = Templates.MessagesProj.Replace("$$HINTS$$", hints); } else { Templates.MessagesProj = Templates.MessagesProj.Replace("$$HINTS$$", ""); } var paths = new List <MsgFileLocation>(); var pathssrv = new List <MsgFileLocation>(); var actionFileLocations = new List <MsgFileLocation>(); Console.WriteLine("Generatinc C# classes for ROS Messages...\n"); foreach (var messageDir in messageDirs) { string d = new DirectoryInfo(Path.GetFullPath(messageDir)).FullName; Console.WriteLine("Looking in " + d); MsgFileLocator.findMessages(paths, pathssrv, actionFileLocations, d); } // sort paths by priority paths = MsgFileLocator.sortMessages(paths); // first pass: create all msg files (and register them in static resolver dictionary) var baseTypes = MessageTypeRegistry.Default.GetTypeNames().ToList(); foreach (MsgFileLocation path in paths) { var typeName = $"{path.package}/{path.basename}"; if (baseTypes.Contains(typeName)) { Logger.LogInformation($"Skip file {path} because MessageBase already contains this message"); } else { msgsFiles.Add(new MsgFile(path)); } } Logger.LogDebug($"Added {msgsFiles.Count} message files"); foreach (MsgFileLocation path in pathssrv) { srvFiles.Add(new SrvFile(path)); } // secend pass: parse and resolve types foreach (var msg in msgsFiles) { msg.ParseAndResolveTypes(); } foreach (var srv in srvFiles) { srv.ParseAndResolveTypes(); } var actionFileParser = new ActionFileParser(actionFileLocations); actionFiles = actionFileParser.GenerateRosMessageClasses(); //var actionFiles = new List<ActionFile>(); if (!StdMsgsProcessed()) // may seem obvious, but needed so that all other messages can build... { string resolvedPkgs = String.Join(", ", MsgFile.resolver.Keys.OrderBy(x => x.ToString()).ToArray()); Console.WriteLine("Missing at least one of the following ROS packages: [\"" + String.Join("\", \"", required_packages) + "\"]. Exiting..."); Console.WriteLine("resolver's keys: [" + resolvedPkgs + "]"); return; } if (paths.Count + pathssrv.Count > 0) { MakeTempDir(outputdir); GenerateFiles(msgsFiles, srvFiles, actionFiles, outputdir); GenerateProject(msgsFiles, srvFiles, projectName, outputdir); BuildProject(configuration, projectName, outputdir); } else { Console.WriteLine("Usage: YAMLParser.exe <SolutionFolder> [... other directories to search]\n The Messages dll will be output to <SolutionFolder>/Messages/Messages.dll"); if (interactive) { Console.ReadLine(); } Environment.Exit(1); } if (interactive) { Console.WriteLine("Finished. Press enter."); Console.ReadLine(); } }