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;
        }
Ejemplo n.º 2
0
 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);
         }
     }
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
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;
 }