/// <summary> /// Builds a project. /// </summary> /// <param name="projectPath">The absolute path to the project.</param> /// <param name="targetsToBuild">The targets to build. If not specified, the project's default target will be invoked.</param> /// <param name="properties">The optional global properties to pass to the project. May come from the <see cref="MSBuild.Properties"/> static class.</param> /// <returns>A task whose result is the result of the build.</returns> public static async Task<BuildResultAndLogs> ExecuteAsync(string projectPath, string[] targetsToBuild = null, IDictionary<string, string> properties = null, ITestOutputHelper testLogger = null) { targetsToBuild = targetsToBuild ?? new string[0]; var logger = new EventLogger(); var logLines = new List<string>(); var parameters = new BuildParameters { Loggers = new List<ILogger> { new ConsoleLogger(LoggerVerbosity.Detailed, logLines.Add, null, null), new ConsoleLogger(LoggerVerbosity.Minimal, v => testLogger?.WriteLine(v.TrimEnd()), null, null), logger, }, }; BuildResult result; using (var buildManager = new BuildManager()) { buildManager.BeginBuild(parameters); try { var requestData = new BuildRequestData(projectPath, properties ?? Properties.Default, null, targetsToBuild, null); var submission = buildManager.PendBuildRequest(requestData); result = await submission.ExecuteAsync(); } finally { buildManager.EndBuild(); } } return new BuildResultAndLogs(result, logger.LogEvents, logLines); }
public void ResultBeforeExecute () { string empty_project_xml = "<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' />"; var path = "file://localhost/foo.xml"; var xml = XmlReader.Create (new StringReader (empty_project_xml), null, path); var root = ProjectRootElement.Create (xml); var proj = new ProjectInstance (root); var bm = new BuildManager (); bm.BeginBuild (new BuildParameters ()); var sub = bm.PendBuildRequest (new BuildRequestData (proj, new string [0])); Assert.IsNull (sub.BuildResult, "#1"); }
private static Task <MSB.Execution.BuildResult> BuildAsync(MSB.Execution.BuildManager buildManager, MSB.Execution.BuildParameters parameters, MSB.Execution.BuildRequestData requestData, CancellationToken cancellationToken) { var taskSource = new TaskCompletionSource <MSB.Execution.BuildResult>(); buildManager.BeginBuild(parameters); // enable cancellation of build CancellationTokenRegistration registration = default(CancellationTokenRegistration); if (cancellationToken.CanBeCanceled) { registration = cancellationToken.Register(() => { try { buildManager.CancelAllSubmissions(); buildManager.EndBuild(); registration.Dispose(); } finally { taskSource.TrySetCanceled(); } }); } // execute build async try { buildManager.PendBuildRequest(requestData).ExecuteAsync(sub => { // when finished try { var result = sub.BuildResult; buildManager.EndBuild(); registration.Dispose(); taskSource.TrySetResult(result); } catch (Exception e) { taskSource.TrySetException(e); } }, null); } catch (Exception e) { taskSource.SetException(e); } return(taskSource.Task); }
public void BuildAndAnalyze() { var globalProps = new Dictionary<string, string> { {"VisualStudioVersion","12.0"} }; pc = new ProjectCollection(globalProps); var diagLogger = new DiagnosticXmlLogger(this); diagLogger.LogFile = _logFilepath; project = pc.LoadProject(_projectFilepath, "12.0"); projInst = project.CreateProjectInstance(); buildManager = new BuildManager(); var buildParams = new BuildParameters(); buildParams.Loggers = new ILogger[] { diagLogger }; buildManager.BeginBuild(buildParams); var brd = new BuildRequestData(projInst, _targets, null, BuildRequestDataFlags.ReplaceExistingProjectInstance); submission = buildManager.PendBuildRequest(brd); buildResult = submission.Execute(); buildManager.EndBuild(); }
static IDisposable beginBuild(BuildManager buildManager, BuildParameters parameters) { buildManager.BeginBuild(parameters); return new DisposeAction(buildManager.EndBuild); }
/// <summary> /// Builds a project. /// </summary> /// <param name="projectInstance">The project to build.</param> /// <param name="targetsToBuild">The targets to build. If not specified, the project's default target will be invoked.</param> /// <returns>A task whose result is the result of the build.</returns> public static async Task<BuildResultAndLogs> ExecuteAsync(ProjectInstance projectInstance, params string[] targetsToBuild) { targetsToBuild = (targetsToBuild == null || targetsToBuild.Length == 0) ? projectInstance.DefaultTargets.ToArray() : targetsToBuild; var logger = new EventLogger(); var logLines = new List<string>(); var parameters = new BuildParameters { Loggers = new List<ILogger> { new ConsoleLogger(LoggerVerbosity.Detailed, logLines.Add, null, null), logger, }, }; BuildResult result; using (var buildManager = new BuildManager()) { buildManager.BeginBuild(parameters); try { var brdFlags = BuildRequestDataFlags.ProvideProjectStateAfterBuild; var requestData = new BuildRequestData(projectInstance, targetsToBuild, null, brdFlags); var submission = buildManager.PendBuildRequest(requestData); result = await submission.ExecuteAsync(); } finally { buildManager.EndBuild(); } } return new BuildResultAndLogs(result, logger.LogEvents, logLines); }
public void EndBuildWaitsForSubmissionCompletion () { // Windows does not have useful sleep or alternative, so skip it bool is_windows = true; switch (Environment.OSVersion.Platform) { case PlatformID.Unix: case PlatformID.MacOSX: is_windows = false; break; } string project_xml = string.Format (@"<Project DefaultTargets='Wait1Sec' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <Target Name='Wait1Sec'> <Exec Command='{0}' /> </Target> </Project>", is_windows ? "powershell -command \"Start-Sleep -s 1\"" : "/bin/sleep 1"); var xml = XmlReader.Create (new StringReader (project_xml)); var root = ProjectRootElement.Create (xml); root.FullPath = "BuildSubmissionTest.EndBuildWaitsForSubmissionCompletion.proj"; var proj = new ProjectInstance (root); var bm = new BuildManager (); bm.BeginBuild (new BuildParameters ()); DateTime waitDone = DateTime.MinValue; DateTime beforeExec = DateTime.Now; var sub = bm.PendBuildRequest (new BuildRequestData (proj, new string [] { "Wait1Sec" })); sub.ExecuteAsync (delegate { waitDone = DateTime.Now; }, null); bm.EndBuild (); Assert.IsTrue (sub.BuildResult.OverallResult == BuildResultCode.Success, "#1"); DateTime endBuildDone = DateTime.Now; Assert.IsTrue (endBuildDone - beforeExec >= TimeSpan.FromSeconds (1), "#2"); Assert.IsTrue (endBuildDone > waitDone, "#3"); }
/// <summary> /// Helper for cache tests. Builds a project and verifies the right cache files are created. /// </summary> private string BuildAndCheckCache(BuildManager localBuildManager, IEnumerable<string> exceptCacheDirectories) { string contents = ObjectModelHelpers.CleanupFileContents(@" <Project xmlns='msbuildnamespace' ToolsVersion='msbuilddefaulttoolsversion'> <Target Name='One' Outputs='one.txt'> </Target> <Target Name='Two' Outputs='two.txt'> </Target> <Target Name='Three' Outputs='three.txt'> </Target> </Project> "); string fileName = Path.GetTempFileName(); File.WriteAllText(fileName, contents); string cacheDirectory = FileUtilities.GetCacheDirectory(); BuildParameters parameters = new BuildParameters(); localBuildManager.BeginBuild(parameters); try { var services = new HostServices(); BuildRequestData data = new BuildRequestData(fileName, new Dictionary<string, string>(), ObjectModelHelpers.MSBuildDefaultToolsVersion, new[] { "One", "Two", "Three" }, services); var result = localBuildManager.PendBuildRequest(data).Execute(); Assert.IsTrue(result.OverallResult == BuildResultCode.Success, "Test project failed to build correctly."); } finally { localBuildManager.EndBuild(); } // Ensure that we got the cache files we expected. There should be one set of results in there, once we exclude // any of the specified directories from previous builds in the same test. string directory = Directory.EnumerateDirectories(cacheDirectory).Except(exceptCacheDirectories).First(); // Within this directory should be a set of target results files, one for each of the targets we invoked. var resultsFiles = Directory.EnumerateFiles(directory).Select(path => Path.GetFileName(path)); Assert.IsTrue(resultsFiles.Count() == 3, "Expected 3 results, got {0}", resultsFiles.Count()); Assert.IsTrue(resultsFiles.Contains("One.cache")); Assert.IsTrue(resultsFiles.Contains("Two.cache")); Assert.IsTrue(resultsFiles.Contains("Three.cache")); // Return the cache directory created for this build. return directory; }
public void ResetCachesDuringBuildIsInvalid () { // Windows does not have useful sleep or alternative, so skip it bool is_windows = true; switch (Environment.OSVersion.Platform) { case PlatformID.Unix: case PlatformID.MacOSX: is_windows = false; break; } string project_xml = string.Format (@"<Project DefaultTargets='Wait1Sec' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <Target Name='Wait1Sec'> <Exec Command='{0}' /> </Target> </Project>", is_windows ? "powershell -command \"Start-Sleep -s 1\"" : "/bin/sleep 1"); var xml = XmlReader.Create (new StringReader (project_xml)); var root = ProjectRootElement.Create (xml); var proj = new ProjectInstance (root); var bm = new BuildManager (); bm.BeginBuild (new BuildParameters ()); var sub = bm.PendBuildRequest (new BuildRequestData (proj, new string [] { "Wait1Sec" })); sub.ExecuteAsync (delegate {}, null); try { bm.ResetCaches (); } finally { bm.EndBuild (); // yes, it should work even after invalid ResetCaches call... at least on .NET it does. } }
public void BasicManualParallelBuilds () { string project_xml = @"<Project DefaultTargets='Wait1Sec' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <Target Name='Wait1Sec'> <!-- Exec Command='ping 10.1.1.1 -n 1 -w 1' /--> <Exec Command='/bin/sleep 1' /> </Target> </Project>"; switch (Environment.OSVersion.Platform) { case PlatformID.MacOSX: case PlatformID.Unix: break; default: return; // ignore, cannot run it } var xml = XmlReader.Create (new StringReader (project_xml)); var root = ProjectRootElement.Create (xml); var proj = new ProjectInstance (root); var bm = new BuildManager (); bm.BeginBuild (new BuildParameters () { Loggers = new ILogger [] {new ConsoleLogger (LoggerVerbosity.Diagnostic, TextWriter.Null.WriteLine, null, null)} }); DateTime waitDone = DateTime.MinValue; DateTime beforeExec = DateTime.Now; var l = new List<BuildSubmission> (); for (int i = 0; i < 10; i++) { var sub = bm.PendBuildRequest (new BuildRequestData (proj, new string [] { "Wait1Sec" })); l.Add (sub); sub.ExecuteAsync (delegate { waitDone = DateTime.Now; }, null); } bm.EndBuild (); Assert.IsTrue (l.All (s => s.BuildResult.OverallResult == BuildResultCode.Success), "#1"); DateTime endBuildDone = DateTime.Now; Assert.IsTrue (endBuildDone - beforeExec >= TimeSpan.FromSeconds (1), "#2"); Assert.IsTrue (endBuildDone > waitDone, "#3"); }
static void Main(string[] args) { var slnInfo = new DirectoryInfo(@"C:\Users\Danni\Desktop\FarExo Prototypes\FarExoCD"); var slnFileInfo = new DirectoryInfo(@"C:\Users\Danni\Desktop\FarExo Prototypes\FarExoCD\FarExoCD.sln"); var projectFileInfo = new FileInfo(@"C:\Users\Danni\Desktop\FarExo Prototypes\FarExoCD\Instrumentation\Instrumentation.Impl\Instrumentation.Impl.csproj"); var outputDirectoryInfo = new DirectoryInfo(@"C:\Users\Danni\Desktop\FarExo Prototypes\FarExoCD\.output"); var logFileInfo = new FileInfo(Path.Combine(outputDirectoryInfo.FullName, "build.log")); var projectCollection = BuildProjectCollection(slnInfo); var globalProperties = new Dictionary<string, string>(); globalProperties.Add("Configuration", "Release"); globalProperties.Add("Platform", "AnyCPU"); globalProperties.Add("BuildInParallel", "True"); globalProperties.Add("OutputPath", outputDirectoryInfo.FullName); var fileLogger = new FileLogger(); fileLogger.Parameters = @"logfile=" + logFileInfo.FullName; var consoleLogger = new ConsoleLogger(LoggerVerbosity.Detailed); foreach (var project in projectCollection.LoadedProjects) { project.SetProperty("Configuration", globalProperties["Configuration"]); project.SetProperty("Platform", globalProperties["Platform"]); project.SetProperty("OutputPath", Path.Combine(globalProperties["OutputPath"], project.GetProperty("MsBuildProjectName").EvaluatedValue, globalProperties["Configuration"])); project.SetProperty("BuildInParallel", globalProperties["BuildInParallel"]); } var buildProject = projectCollection.LoadedProjects.Single(x => x.GetProperty("MsBuildProjectName").EvaluatedValue == "Instrumentation.Impl"); var propertyList = buildProject.Properties.Where(x => x.EvaluatedValue.Contains(@"bin\")); var buildParameters = new BuildParameters(projectCollection); buildParameters.Loggers = new List<ILogger> { consoleLogger }; if (buildParameters.Toolsets.Any(x => x.ToolsVersion == _defaultToolsVersion)) { buildParameters.DefaultToolsVersion = _defaultToolsVersion; } else { throw new Exception($"Tools version {_defaultToolsVersion} are not available."); } var buildRequest = new BuildRequestData(buildProject.CreateProjectInstance(ProjectInstanceSettings.None), new string[] { _defaultTarget }); var buildManager = new BuildManager(); BuildResult buildResult = null; try { buildManager.BeginBuild(buildParameters); buildResult = buildManager.BuildRequest(buildRequest); buildManager.EndBuild(); projectCollection.UnregisterAllLoggers(); } catch (Exception ex) { throw ex; } finally { File.Delete(logFileInfo.FullName); } }