private async void CallGenerateCodes(Workspace workspace, string solutionFullName) { Stopwatch sw = null; try { sw = Stopwatch.StartNew(); IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(), new BitSourceGeneratorBitConfigProvider(solutionFullName), dtosProvider , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider)); await generator.GenerateCodes(workspace); Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspace.GetType().Name}"); } catch (Exception ex) { LogException("Code Generation failed.", ex); throw; } finally { sw?.Stop(); } }
private async Task CallGenerateCodes(MSBuildWorkspace workspace, Project beingCompiledProject, string solutionFullName) { Stopwatch sw = null; try { sw = Stopwatch.StartNew(); workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed; workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true; IReadOnlyList <ProjectInSolution> allProjects = SolutionFile.Parse(solutionFullName).ProjectsInOrder; BitSourceGeneratorBitConfigProvider bitConfigProvider = new BitSourceGeneratorBitConfigProvider(solutionFullName); foreach (BitCodeGeneratorMapping mapping in bitConfigProvider.GetConfiguration(workspace).BitCodeGeneratorConfigs.BitCodeGeneratorMappings.Where(config => config.SourceProjects.Any(sp => sp.Name == beingCompiledProject.Name))) { foreach (BitTools.Core.Model.ProjectInfo proj in mapping.SourceProjects) { if (workspace.CurrentSolution.Projects.Any(p => p.Name == proj.Name)) { continue; /*It's already loaded*/ } await workspace.OpenProjectAsync(allProjects.ExtendedSingle($"Trying to find source project {proj.Name}", p => p.ProjectName == proj.Name).AbsolutePath); } if (!workspace.CurrentSolution.Projects.Any(p => p.Name == mapping.DestinationProject.Name)) { await workspace.OpenProjectAsync(allProjects.ExtendedSingle($"Trying to find destination project {mapping.DestinationProject.Name}", p => p.ProjectName == mapping.DestinationProject.Name).AbsolutePath); } } IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(), bitConfigProvider, dtosProvider , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider)); await generator.GenerateCodes(workspace); Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspace.GetType().Name}."); } catch (Exception ex) { LogException("Code Generation failed.", ex); throw; } finally { sw?.Stop(); workspace.WorkspaceFailed -= MSBuildWorkspace_WorkspaceFailed; } }
static async Task GenerateCodes() { BitSourceGeneratorBitConfigProvider bitConfigProvider = new BitSourceGeneratorBitConfigProvider(_bitConfigFilePath !, BeingCompiledProjectName); BitConfig bitConfig = bitConfigProvider.GetConfiguration(); using (MSBuildWorkspace workspace = MSBuildWorkspace.Create(new Dictionary <string, string> { { "TargetFramework", bitConfig.TargetFramework ?? "net5.0" } })) { workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true; workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed; foreach (BitCodeGeneratorMapping mapping in bitConfigProvider.GetConfiguration().BitCodeGeneratorConfigs.BitCodeGeneratorMappings) { foreach (Bit.Tooling.Core.Model.ProjectInfo proj in mapping.SourceProjects) { if (workspace.CurrentSolution.Projects.Any(p => proj.IsThisProject(p))) { continue; /*It's already loaded*/ } string sourceProjetctPath = proj.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {proj.Name}")).ExtendedSingle($"Trying to find source project {proj.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == proj.Name); await workspace.OpenProjectAsync(sourceProjetctPath); } if (!workspace.CurrentSolution.Projects.Any(p => mapping.DestinationProject.IsThisProject(p))) { string DestProjetctPath = mapping.DestinationProject.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {mapping.DestinationProject.Name}")).ExtendedSingle($"Trying to find destination project {mapping.DestinationProject.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == mapping.DestinationProject.Name); await workspace.OpenProjectAsync(DestProjetctPath); } } IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); IBitCodeGeneratorOrderedProjectsProvider bitCodeGeneratorOrderedProjectsProvider = new DefaultBitCodeGeneratorOrderedProjectsProvider(); IProjectEnumTypesProvider projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider); DefaultTypeScriptClientProxyGenerator tsGenerator = new DefaultTypeScriptClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, dtosProvider , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, projectEnumTypesProvider); await tsGenerator.GenerateCodes(workspace); DefaultCSharpClientProxyGenerator csGenerator = new DefaultCSharpClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, controllersProvider, new DefaultCSharpClientContextGenerator()); await csGenerator.GenerateCodes(workspace); } }
private async System.Threading.Tasks.Task CallGenerateCodes() { if (bitWorkspaceIsPrepared == false) { return; } Stopwatch sw = null; try { sw = Stopwatch.StartNew(); IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(), new DefaultBitConfigProvider(), dtosProvider , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider)); Workspace workspaceForCodeGeneration = await GetWorkspaceForCodeGeneration(); try { await generator.GenerateCodes(workspaceForCodeGeneration); Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspaceForCodeGeneration.GetType().Name}"); } finally { if (!(workspaceForCodeGeneration is VisualStudioWorkspace)) { workspaceForCodeGeneration.Dispose(); } } } catch (Exception ex) { LogException("Code Generation failed.", ex); } finally { sw?.Stop(); } }
private static async Task AsyncMain(string[] args) { FluentCommandLineParser <BitCLIV1Args> commandLineParser = new FluentCommandLineParser <BitCLIV1Args>(); commandLineParser.Setup(arg => arg.Action) .As('a', "action") .SetDefault(BitCLIV1Action.Generate) .WithDescription($"Action to perform. {nameof(BitCLIV1Action.Clean)} || {nameof(BitCLIV1Action.Generate)} || {nameof(BitCLIV1Action.Validate)}. Required"); commandLineParser.Setup(arg => arg.Path) .As('p', "path") .Required() .WithDescription("Path to solution file. Required."); commandLineParser.SetupHelp("?", "help") .Callback(helpText => WriteInfo(helpText)); ICommandLineParserResult result = commandLineParser.Parse(args); if (result.HasErrors == true) { throw new Exception(result.ErrorText); } else { BitCLIV1Args typedArgs = commandLineParser.Object; typedArgs.Path = Path.Combine(Environment.CurrentDirectory, typedArgs.Path); if (!File.Exists(typedArgs.Path)) { throw new FileNotFoundException($"Solution could not be found at {typedArgs.Path}"); } WriteInfo($"Solution Path: {typedArgs.Path}"); WriteInfo($"Action: {typedArgs.Action}"); try { WriteMessage("DotNetBuild started..."); using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false)) using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false)) { using (Process dotnetBuildProcess = new Process()) { dotnetBuildProcess.StartInfo.UseShellExecute = false; dotnetBuildProcess.StartInfo.RedirectStandardOutput = dotnetBuildProcess.StartInfo.RedirectStandardError = true; dotnetBuildProcess.StartInfo.FileName = "dotnet"; dotnetBuildProcess.StartInfo.Arguments = $"build {typedArgs.Path}"; dotnetBuildProcess.StartInfo.CreateNoWindow = true; dotnetBuildProcess.StartInfo.WorkingDirectory = Directory.GetParent(typedArgs.Path).FullName; dotnetBuildProcess.OutputDataReceived += (sender, e) => { if (e.Data != null) { WriteMessage(e.Data); } else { outputWaitHandle.Set(); } }; dotnetBuildProcess.ErrorDataReceived += (sender, e) => { if (e.Data != null) { WriteError(e.Data); } else { errorWaitHandle.Set(); } }; dotnetBuildProcess.Start(); dotnetBuildProcess.BeginOutputReadLine(); dotnetBuildProcess.BeginErrorReadLine(); dotnetBuildProcess.WaitForExit(); outputWaitHandle.WaitOne(); errorWaitHandle.WaitOne(); } } WriteMessage("DotNetBuild completed"); } catch (Exception ex) { WriteError($"DotNetBuild Error => {ex.ToString()}"); } using (MSBuildWorkspace workspace = MSBuildWorkspace.Create()) { workspace.LoadMetadataForReferencedProjects = workspace.SkipUnrecognizedProjects = true; workspace.WorkspaceFailed += Workspace_WorkspaceFailed; await workspace.OpenSolutionAsync(typedArgs.Path); switch (typedArgs.Action) { case BitCLIV1Action.Generate: IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(), new DefaultBitConfigProvider(), dtosProvider, new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider)); await generator.GenerateCodes(workspace); break; case BitCLIV1Action.Validate: throw new NotImplementedException("Validate"); case BitCLIV1Action.Clean: throw new NotImplementedException("Clean"); default: throw new NotSupportedException(); } } } }