/// <summary> /// Builds the requested target framework(s). /// </summary> /// <param name="targetFrameworks">The set of target frameworks to build.</param> /// <param name="environmentOptions">The environment options to use for the build.</param> /// <returns>A dictionary of target frameworks to <see cref="AnalyzerResult"/>.</returns> public AnalyzerResults Build(string[] targetFrameworks, EnvironmentOptions environmentOptions) { if (environmentOptions == null) { throw new ArgumentNullException(nameof(environmentOptions)); } // If the set of target frameworks is empty, just build the default if (targetFrameworks == null || targetFrameworks.Length == 0) { targetFrameworks = new string[] { null }; } // Create a new build envionment for each target AnalyzerResults results = new AnalyzerResults(); foreach (string targetFramework in targetFrameworks) { BuildEnvironment buildEnvironment = EnvironmentFactory.GetBuildEnvironment(targetFramework, environmentOptions); string[] targetsToBuild = buildEnvironment.TargetsToBuild; Restore(buildEnvironment, ref targetsToBuild); results.Add(BuildTargets(buildEnvironment, targetFramework, targetsToBuild, true)); } return(results); }
/// <summary> /// Builds the requested target framework(s). /// </summary> /// <param name="targetFrameworks">The set of target frameworks to build.</param> /// <param name="buildEnvironment">The build environment to use for the build.</param> /// <returns>A dictionary of target frameworks to <see cref="AnalyzerResult"/>.</returns> public AnalyzerResults Build(string[] targetFrameworks, BuildEnvironment buildEnvironment) { if (buildEnvironment == null) { throw new ArgumentNullException(nameof(buildEnvironment)); } // If the set of target frameworks is empty, just build the default if (targetFrameworks == null || targetFrameworks.Length == 0) { targetFrameworks = new string[] { null }; } // Reset the cache before every build in case MSBuild cached something from a project reference build Manager.BuildManager.ResetCaches(); string[] targetsToBuild = buildEnvironment.TargetsToBuild; Restore(buildEnvironment, ref targetsToBuild); AnalyzerResults results = new AnalyzerResults(); foreach (string targetFramework in targetFrameworks) { results.Add(BuildTargets(buildEnvironment, targetFramework, targetsToBuild)); } return(results); }
/// <summary> /// Builds the requested target framework(s). /// </summary> /// <param name="targetFrameworks">The set of target frameworks to build.</param> /// <param name="buildEnvironment">The build environment to use for the build.</param> /// <returns>A dictionary of target frameworks to <see cref="AnalyzerResult"/>.</returns> public AnalyzerResults Build(string[] targetFrameworks, BuildEnvironment buildEnvironment) { if (buildEnvironment == null) { throw new ArgumentNullException(nameof(buildEnvironment)); } // If the set of target frameworks is empty, just build the default if (targetFrameworks == null || targetFrameworks.Length == 0) { targetFrameworks = new string[] { null }; } AnalyzerResults results = new AnalyzerResults(); foreach (string targetFramework in targetFrameworks) { BuildTargets(buildEnvironment, targetFramework, buildEnvironment.TargetsToBuild, results); } return(results); }
// This is where the magic happens - returns one result per result target framework private AnalyzerResults BuildTargets(BuildEnvironment buildEnvironment, string targetFramework, string[] targetsToBuild, AnalyzerResults results) { using (CancellationTokenSource cancellation = new CancellationTokenSource()) { using (AnonymousPipeLoggerServer pipeLogger = new AnonymousPipeLoggerServer(cancellation.Token)) { using (EventProcessor eventProcessor = new EventProcessor(Manager, this, BuildLoggers, pipeLogger, results != null)) { // Run MSBuild int exitCode; string fileName = GetCommand(buildEnvironment, targetFramework, targetsToBuild, pipeLogger.GetClientHandle(), out string arguments); using (ProcessRunner processRunner = new ProcessRunner(fileName, arguments, Path.GetDirectoryName(ProjectFile.Path), GetEffectiveEnvironmentVariables(buildEnvironment), Manager.LoggerFactory)) { processRunner.Exited = () => cancellation.Cancel(); processRunner.Start(); pipeLogger.ReadAll(); processRunner.Process.WaitForExit(); exitCode = processRunner.Process.ExitCode; } // Collect the results results?.Add(eventProcessor.Results, exitCode == 0 && eventProcessor.OverallSuccess); } } } return(results); }