private async Task InstallDependenciesAsync(ConanRunner conan, ConanProject project) { foreach (var configuration in project.Configurations) { var installPath = configuration.InstallPath; await Task.Run(() => Directory.CreateDirectory(installPath)); var logFilePath = Path.Combine(installPath, $"conan_{Guid.NewGuid().ToString()}.log"); using (var logFile = File.Open(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read)) using (var logStream = new StreamWriter(logFile)) { ConanGeneratorType generator = _settingsService.GetConanGenerator(); ConanBuildType build = _settingsService.GetConanBuild(); bool update = _settingsService.GetConanUpdate(); var process = await conan.Install(project, configuration, generator, build, update); string message = $"[Conan.VisualStudio] Calling process '{process.StartInfo.FileName}' " + $"with arguments '{process.StartInfo.Arguments}'"; Logger.Log(message); await logStream.WriteLineAsync(message); using (var reader = process.StandardOutput) { string line; while ((line = await reader.ReadLineAsync()) != null) { await logStream.WriteLineAsync(line); Logger.Log(line); } } var exitCode = await process.WaitForExitAsync(); if (exitCode != 0) { message = $"Conan has returned exit code '{exitCode}' " + $"while processing configuration '{configuration}'. " + $"Please check file '{logFilePath}' for details."; Logger.Log(message); await logStream.WriteLineAsync(message); _errorListService.WriteError(message, logFilePath); return; } else { message = $"[Conan.VisualStudio] Conan has succsessfully installed configuration '{configuration}'"; Logger.Log(message); await logStream.WriteLineAsync(message); _errorListService.WriteMessage(message); } } } }
private async Task <bool> InstallDependenciesAsync(ConanRunner conan, ConanProject project) { foreach (var configuration in project.Configurations) { var installPath = configuration.InstallPath; await Task.Run(() => Directory.CreateDirectory(installPath)); var logFilePath = Path.Combine(installPath, $"conan_{Guid.NewGuid().ToString()}.log"); using (var logFile = File.Open(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read)) using (var logStream = new StreamWriter(logFile)) { ConanGeneratorType generator = _settingsService.GetConanGenerator(); ConanBuildType build = _settingsService.GetConanBuild(); bool update = _settingsService.GetConanUpdate(); ProcessStartInfo process = null; try { // Run 'conan --version' for log purposes process = conan.Version(); int exitCode = await Utils.RunProcessAsync(process, logStream); if (exitCode != 0) { string message = "Cannot get Conan version, check that the " + "executable is pointing to a valid one"; Logger.Log(message); await logStream.WriteLineAsync(message); _errorListService.WriteError(message, logFilePath); } // Run the install process = conan.Install(project, configuration, generator, build, update, _errorListService); exitCode = await Utils.RunProcessAsync(process, logStream); if (exitCode != 0) { string message = $"Conan has returned exit code '{exitCode}' " + $"while processing configuration '{configuration}'. " + $"Please check file '{logFilePath}' for details."; Logger.Log(message); await logStream.WriteLineAsync(message); _errorListService.WriteError(message, logFilePath); return(false); } else { string message = $"[Conan.VisualStudio] Conan has succsessfully " + $"installed configuration '{configuration}'"; Logger.Log(message); await logStream.WriteLineAsync(message); _errorListService.WriteMessage(message); } } catch (System.ComponentModel.Win32Exception e) { string message = $"[Conan.VisualStudio] Unhandled error running '{process.FileName}'" + $": {e.Message}. Check log file '{logFilePath}' for details"; Logger.Log(message); await logStream.WriteLineAsync(message); _errorListService.WriteError(message); return(false); } } } return(true); }