public MainWindow() { InitializeComponent(); var log = new StepwiseLog(); MyLogView.DataSource = log; for (int i = 0; i < 5; i++) { var step = new SpecificStepLog { Description = $"Step {i} >> Sample", Content = "Current runner version: '1'" }; log.Steps.Add(step); } log.Steps[3].State = StepState.Success; log.Steps[4].State = StepState.Failed; }
private async void ExecuteButton_Click(object sender, RoutedEventArgs e) { var log = new StepwiseLog(); MyLogView.DataSource = log; ViewModel.JobState = StepState.Processing; var success = await ExecuteJob(log); ViewModel.JobState = success ? StepState.Success : StepState.Failed; if (success && ViewModel.RunAfterBuild) { var possibleExePaths = new string[] { "main.exe", $"{ViewModel.ProjectConfig}\\main.exe" }; var exePath = possibleExePaths.Select(x => Path.Combine(ViewModel.BuildPath, x)).FirstOrDefault(File.Exists); if (exePath != null) { using var process = Process.Start(exePath); } } }
private async Task<bool> RunProcessAsync(StepwiseLog log, string description, Func<CMakeKit.ModifyStartInfo, Process> createProcess) { var textBlock = new TextBlock() { TextWrapping = TextWrapping.Wrap }; var step = new SpecificStepLog() { Description = description, Content = textBlock }; log.Steps.Add(step); var helper = new ProcessOutputToLogHelper(textBlock); var process = createProcess(helper.ModifyStartInfo); helper.HandOverProcess(process); await Task.Run(() => { process.WaitForExit(); }); step.State = process.ExitCode == 0 ? StepState.Success : StepState.Failed; return process.ExitCode == 0; }
private async Task<bool> ExecuteJob(StepwiseLog log) { var eocLogWriter = new StringWriter(); var eocLogger = new StreamLoggerWithContext(eocLogWriter, eocLogWriter, false); var step = new SpecificStepLog() { Description = "转换为C++/CMake工程", }; log.Steps.Add(step); try { if (!EocEnv.IsValid) { eocLogger.Error("环境变量EOC_HOME未正确配置"); step.State = StepState.Failed; } var source = new EProjectFile.EProjectFile(); source.Load(File.OpenRead(ViewModel.SourcePath)); if (source.ESystemInfo.FileType != 3 && !ViewModel.Force) { eocLogger.Error("源文件应为ECom(*.ec)文件"); step.State = StepState.Failed; } else { await Task.Run(() => { new ProjectConverter(source, ViewModel.ProjectType, null, eocLogger).Generate(ViewModel.OutputPath); eocLogger.Info("完成"); }); } } catch (Exception exception) { eocLogger.Error("处理程序不正常退出,异常信息:{0}", exception); step.State = StepState.Failed; } step.Content = new TextBlock() { TextWrapping = TextWrapping.Wrap, Text = eocLogWriter.ToString() }; if (step.State == StepState.Failed) { return false; } step.State = StepState.Success; if (!ViewModel.Build) { return false; } step = new SpecificStepLog() { Description = "初始化CMake环境", }; log.Steps.Add(step); if (CMakeEnv.DefaultInstance == null) { step.State = StepState.Failed; step.Content = new TextBlock() { TextWrapping = TextWrapping.Wrap, Text = "Error: 未找到CMake编译环境" }; return false; } if (ViewModel.CMakeKit == null || ViewModel.ProjectConfig == null) { step.State = StepState.Failed; step.Content = new TextBlock() { TextWrapping = TextWrapping.Wrap, Text = "Error: 工具链参数不完整" }; return false; } step.Content = new TextBlock() { TextWrapping = TextWrapping.Wrap, Text = $"CMake Detected: {CMakeEnv.DefaultInstance.CMakeBin}" }; CMakeKit cmakeKit; try { cmakeKit = new CMakeKit(ViewModel.CMakeKit); } catch (Exception) { step.State = StepState.Failed; step.Content = new TextBlock() { TextWrapping = TextWrapping.Wrap, Text = $"Error: 初始化工具链 (${ViewModel.CMakeKit?.Name}) 失败" }; return false; } step.State = StepState.Success; var success = await RunProcessAsync(log, "配置CMake工程", startInfoHelper => cmakeKit.StartConfigure( CMakeEnv.DefaultInstance, ViewModel.OutputPath, ViewModel.BuildPath, new Dictionary<string, CMakeSetting>() { {"CMAKE_BUILD_TYPE", new CMakeSetting(ViewModel.ProjectConfig, "STRING") } }, startInfoHelper)); if (!success) { return false; } success = await RunProcessAsync(log, "编译CMake工程", startInfoHelper => cmakeKit.StartBuild( CMakeEnv.DefaultInstance, ViewModel.BuildPath, new CMakeBuildConfig() { Config = ViewModel.ProjectConfig }, startInfoHelper)); if (!success) { return false; } return true; }