public void Run(string projectJson, List <ExternalType> tsTypes) { var root = Path.GetDirectoryName(projectJson); var configFile = Path.Combine(root, "sergen.json"); if (!File.Exists(configFile)) { System.Console.Error.WriteLine("Can't find sergen.json in current directory!"); Environment.Exit(1); } var config = GeneratorConfig.LoadFromJson(File.ReadAllText(configFile)); if (config.ServerTypings == null) { System.Console.Error.WriteLine("ServerTypings is not configured in sergen.json file!"); Environment.Exit(1); } if (config.ServerTypings.Assemblies.IsEmptyOrNull()) { System.Console.Error.WriteLine("ServerTypings has no assemblies configured in sergen.json file!"); Environment.Exit(1); } if (config.RootNamespace.IsEmptyOrNull()) { System.Console.Error.WriteLine("Please set RootNamespace option in sergen.json file!"); Environment.Exit(1); } var outDir = Path.Combine(root, (config.ServerTypings.OutDir.TrimToNull() ?? "Imports/ServerTypings") .Replace('/', Path.DirectorySeparatorChar)); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("Transforming ServerTypings at: "); Console.ResetColor(); Console.WriteLine(outDir); List <Assembly> assemblies = new List <Assembly>(); foreach (var assembly in config.ServerTypings.Assemblies) { assemblies.Add(AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.Combine(root, assembly))); } var generator = new ServerTypingsGenerator(assemblies.ToArray()); generator.RootNamespaces.Add(config.RootNamespace); foreach (var type in tsTypes) { generator.AddTSType(type); } var codeByFilename = generator.Run(); new MultipleOutputHelper().WriteFiles(outDir, codeByFilename, "*.ts"); }
public void Run(string csproj, List <ExternalType> tsTypes) { var projectDir = Path.GetDirectoryName(csproj); var config = GeneratorConfig.LoadFromFile(Path.Combine(projectDir, "sergen.json")); string[] assemblyFiles = null; if (config.ServerTypings == null || config.ServerTypings.Assemblies.IsEmptyOrNull()) { var xe = XElement.Parse(File.ReadAllText(csproj)); var xtarget = xe.Descendants("TargetFramework").FirstOrDefault(); if (xtarget == null || string.IsNullOrEmpty(xtarget.Value)) { System.Console.Error.WriteLine("Couldn't read TargetFramework from project file for server typings generation!"); Environment.Exit(1); } string outputName; var xasm = xe.Descendants("AssemblyName").FirstOrDefault(); if (xasm == null || string.IsNullOrEmpty(xasm.Value)) { outputName = Path.ChangeExtension(Path.GetFileName(csproj), null); } else { outputName = xasm.Value; } var outputExtension = ".dll"; var targetFramework = xtarget.Value; if (targetFramework.StartsWith("net") && !targetFramework.StartsWith("netcoreapp")) { outputExtension = ".exe"; } var outputPath1 = Path.Combine(Path.GetDirectoryName(csproj), "bin/Debug/" + targetFramework + "/" + outputName + outputExtension) .Replace('/', Path.DirectorySeparatorChar); var outputPath2 = Path.Combine(Path.GetDirectoryName(csproj), "bin/Release/" + targetFramework + "/" + outputName + outputExtension) .Replace('/', Path.DirectorySeparatorChar); if (File.Exists(outputPath1)) { if (File.Exists(outputPath2) && File.GetLastWriteTime(outputPath1) < File.GetLastWriteTime(outputPath2)) { assemblyFiles = new[] { outputPath2 } } ; else { assemblyFiles = new[] { outputPath1 } }; } else if (File.Exists(outputPath2)) { assemblyFiles = new[] { outputPath2 } } ; else { System.Console.Error.WriteLine(String.Format("Couldn't find output file for server typings generation at {0}!" + Environment.NewLine + "Make sure project is built successfully before running Sergen", outputPath1)); Environment.Exit(1); } } if (assemblyFiles == null) { if (config.ServerTypings == null) { System.Console.Error.WriteLine("ServerTypings is not configured in sergen.json file!"); Environment.Exit(1); } if (config.ServerTypings.Assemblies.IsEmptyOrNull()) { System.Console.Error.WriteLine("ServerTypings has no assemblies configured in sergen.json file!"); Environment.Exit(1); } assemblyFiles = config.ServerTypings.Assemblies; for (var i = 0; i < assemblyFiles.Length; i++) { var assemblyFile1 = Path.GetFullPath(assemblyFiles[i].Replace('/', Path.DirectorySeparatorChar)); var binDebugIdx = assemblyFile1.IndexOf("/bin/Debug/", StringComparison.OrdinalIgnoreCase); string assemblyFile2 = assemblyFile1; if (binDebugIdx >= 0) { assemblyFile2 = assemblyFile1.Substring(0, binDebugIdx) + "/bin/Release/" + assemblyFile1.Substring(binDebugIdx + "/bin/Release".Length); } assemblyFiles[i] = assemblyFile1; if (File.Exists(assemblyFile1)) { if (File.Exists(assemblyFile2) && File.GetLastWriteTime(assemblyFile1) < File.GetLastWriteTime(assemblyFile2)) { assemblyFiles[i] = assemblyFile2; } } else if (File.Exists(assemblyFile2)) { assemblyFiles[i] = assemblyFile2; } else { System.Console.Error.WriteLine(String.Format(String.Format("Assembly file '{0}' specified in sergen.json is not found! " + "This might happen when project is not successfully built or file name doesn't match the output DLL." + "Please check path in sergen.json and try again.", assemblyFile1))); Environment.Exit(1); } } } if (config.RootNamespace.IsEmptyOrNull()) { System.Console.Error.WriteLine("Please set RootNamespace option in sergen.json file!"); Environment.Exit(1); } var outDir = Path.Combine(projectDir, (config.ServerTypings.OutDir.TrimToNull() ?? "Imports/ServerTypings") .Replace('/', Path.DirectorySeparatorChar)); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("Transforming ServerTypings at: "); Console.ResetColor(); Console.WriteLine(outDir); List <Assembly> assemblies = new List <Assembly>(); foreach (var assemblyFile in assemblyFiles) { #if COREFX using (var dynamicContext = new AssemblyResolver(assemblyFile)) { var asm = dynamicContext.Assembly; #else { var asm = Assembly.LoadFrom(assemblyFile); #endif try { asm.GetTypes(); assemblies.Add(asm); } catch (ReflectionTypeLoadException ex1) { System.Console.Error.WriteLine(String.Format("Couldn't list types in project assembly: '{0}'!", assemblyFile) + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, ex1.LoaderExceptions.Select(x => x.Message).Distinct())); Environment.Exit(1); } catch (Exception ex) { System.Console.Error.WriteLine(String.Format("Couldn't list types in project assembly: '{0}'! ", assemblyFile) + Environment.NewLine + Environment.NewLine + ex.ToString()); Environment.Exit(1); } } } Extensibility.ExtensibilityHelper.SelfAssemblies = new Assembly[] { typeof(LocalTextRegistry).Assembly, typeof(SqlConnections).Assembly, typeof(Row).Assembly, typeof(SaveRequestHandler <>).Assembly, typeof(WebSecurityHelper).Assembly }.Concat(assemblies).Distinct().ToArray(); var generator = new ServerTypingsGenerator(assemblies.ToArray()); generator.RootNamespaces.Add(config.RootNamespace); foreach (var type in tsTypes) { generator.AddTSType(type); } var codeByFilename = generator.Run(); new MultipleOutputHelper().WriteFiles(outDir, codeByFilename, "*.ts"); } }
public void Run(string csproj, List <ExternalType> tsTypes) { var projectDir = Path.GetDirectoryName(csproj); var config = GeneratorConfig.LoadFromFile(Path.Combine(projectDir, "sergen.json")); if (config.ServerTypings == null) { System.Console.Error.WriteLine("ServerTypings is not configured in sergen.json file!"); Environment.Exit(1); } if (config.ServerTypings.Assemblies.IsEmptyOrNull()) { System.Console.Error.WriteLine("ServerTypings has no assemblies configured in sergen.json file!"); Environment.Exit(1); } if (config.RootNamespace.IsEmptyOrNull()) { System.Console.Error.WriteLine("Please set RootNamespace option in sergen.json file!"); Environment.Exit(1); } var outDir = Path.Combine(projectDir, (config.ServerTypings.OutDir.TrimToNull() ?? "Imports/ServerTypings") .Replace('/', Path.DirectorySeparatorChar)); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("Transforming ServerTypings at: "); Console.ResetColor(); Console.WriteLine(outDir); var rootPath = Path.GetFullPath(config.ServerTypings.Assemblies[0].Replace('/', Path.DirectorySeparatorChar)); var loadContext = new ProjectLoadContext(csproj, Path.GetDirectoryName(rootPath)); List <Assembly> assemblies = new List <Assembly>(); foreach (var assembly in config.ServerTypings.Assemblies) { var fullName = Path.GetFullPath(assembly.Replace('/', Path.DirectorySeparatorChar)); assemblies.Add(loadContext.LoadFromAssemblyPath(fullName)); } Extensibility.ExtensibilityHelper.SelfAssemblies = new Assembly[] { typeof(LocalTextRegistry).GetAssembly(), typeof(SqlConnections).GetAssembly(), typeof(Row).GetAssembly(), typeof(SaveRequestHandler <>).GetAssembly(), typeof(WebSecurityHelper).GetAssembly() }.Concat(assemblies).Distinct().ToArray(); var generator = new ServerTypingsGenerator(assemblies.ToArray()); generator.RootNamespaces.Add(config.RootNamespace); foreach (var type in tsTypes) { generator.AddTSType(type); } var codeByFilename = generator.Run(); new MultipleOutputHelper().WriteFiles(outDir, codeByFilename, "*.ts"); }
public void Run(string csproj, List <ExternalType> tsTypes) { var projectDir = Path.GetDirectoryName(csproj); var config = GeneratorConfig.LoadFromFile(Path.Combine(projectDir, "sergen.json")); string[] assemblyFiles = null; if (config.ServerTypings == null || config.ServerTypings.Assemblies.IsEmptyOrNull()) { var xe = XElement.Parse(File.ReadAllText(csproj)); var xtarget = xe.Descendants("TargetFramework").FirstOrDefault(); if (xtarget == null || string.IsNullOrEmpty(xtarget.Value)) { System.Console.Error.WriteLine("Couldn't read TargetFramework from project file for server typings generation!"); Environment.Exit(1); } string outputName; var xasm = xe.Descendants("AssemblyName").FirstOrDefault(); if (xasm == null || string.IsNullOrEmpty(xasm.Value)) { outputName = Path.ChangeExtension(Path.GetFileName(csproj), null); } else { outputName = xasm.Value; } var outputExtension = ".dll"; var targetFramework = xtarget.Value; if (targetFramework.StartsWith("net") && !targetFramework.StartsWith("netcoreapp")) { outputExtension = ".exe"; } var outputPath1 = Path.Combine(Path.GetDirectoryName(csproj), "bin/Debug/" + targetFramework + "/" + outputName + outputExtension) .Replace('/', Path.DirectorySeparatorChar); var outputPath2 = Path.Combine(Path.GetDirectoryName(csproj), "bin/Release/" + targetFramework + "/" + outputName + outputExtension) .Replace('/', Path.DirectorySeparatorChar); if (File.Exists(outputPath1)) { if (File.Exists(outputPath2) && File.GetLastWriteTime(outputPath1) < File.GetLastWriteTime(outputPath2)) { assemblyFiles = new[] { outputPath2 } } ; else { assemblyFiles = new[] { outputPath1 } }; } else if (File.Exists(outputPath2)) { assemblyFiles = new[] { outputPath2 } } ; else { System.Console.Error.WriteLine(String.Format("Couldn't find output file for server typings generation at {0}!" + Environment.NewLine + "Make sure project is built successfully before running Sergen", outputPath1)); Environment.Exit(1); } } if (assemblyFiles == null) { if (config.ServerTypings == null) { System.Console.Error.WriteLine("ServerTypings is not configured in sergen.json file!"); Environment.Exit(1); } if (config.ServerTypings.Assemblies.IsEmptyOrNull()) { System.Console.Error.WriteLine("ServerTypings has no assemblies configured in sergen.json file!"); Environment.Exit(1); } assemblyFiles = config.ServerTypings.Assemblies; for (var i = 0; i < assemblyFiles.Length; i++) { var assemblyFile1 = Path.GetFullPath(assemblyFiles[i].Replace('/', Path.DirectorySeparatorChar)); var binDebugIdx = assemblyFile1.IndexOf("/bin/Debug/", StringComparison.OrdinalIgnoreCase); string assemblyFile2 = assemblyFile1; if (binDebugIdx >= 0) { assemblyFile2 = assemblyFile1.Substring(0, binDebugIdx) + "/bin/Release/" + assemblyFile1.Substring(binDebugIdx + "/bin/Release".Length); } assemblyFiles[i] = assemblyFile1; if (File.Exists(assemblyFile1)) { if (File.Exists(assemblyFile2) && File.GetLastWriteTime(assemblyFile1) < File.GetLastWriteTime(assemblyFile2)) { assemblyFiles[i] = assemblyFile2; } } else if (File.Exists(assemblyFile2)) { assemblyFiles[i] = assemblyFile2; } else { System.Console.Error.WriteLine(String.Format(String.Format("Assembly file '{0}' specified in sergen.json is not found! " + "This might happen when project is not successfully built or file name doesn't match the output DLL." + "Please check path in sergen.json and try again.", assemblyFile1))); Environment.Exit(1); } } } if (config.RootNamespace.IsEmptyOrNull()) { System.Console.Error.WriteLine("Please set RootNamespace option in sergen.json file!"); Environment.Exit(1); } var generator = new ServerTypingsGenerator(assemblyFiles.ToArray()); generator.LocalTexts = config.ServerTypings != null && config.ServerTypings.LocalTexts; var appSettings = Path.Combine(projectDir, "appsettings.json"); if (generator.LocalTexts && File.Exists(appSettings)) { try { var obj = JObject.Parse(File.ReadAllText(appSettings)); var packages = ((obj["AppSettings"] as JObject)?["LocalTextPackages"] as JObject); if (packages != null) { foreach (var p in packages.PropertyValues()) { foreach (var x in p.Values <string>()) { generator.LocalTextFilters.Add(x); } } } } catch (Exception ex) { System.Console.WriteLine("Error occured while parsing appsettings.json!" + Environment.NewLine + ex.ToString()); } } var outDir = Path.Combine(projectDir, (config.ServerTypings.OutDir.TrimToNull() ?? "Imports/ServerTypings") .Replace('/', Path.DirectorySeparatorChar)); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("Transforming ServerTypings at: "); Console.ResetColor(); Console.WriteLine(outDir); generator.RootNamespaces.Add(config.RootNamespace); foreach (var type in tsTypes) { generator.AddTSType(type); } var codeByFilename = generator.Run(); new MultipleOutputHelper().WriteFiles(outDir, codeByFilename, "*.ts"); }