public static Task <BuildResult> ExecuteAsync(this BuildSubmission submission) { var tcs = new TaskCompletionSource <BuildResult>(); submission.ExecuteAsync(SetBuildComplete, tcs); return(tcs.Task); }
/// <summary> /// Builds all the content files which have been added to the project, /// dynamically creating .xnb files in the OutputDirectory. /// Returns an error message if the build fails. /// </summary> public string Build() { // Clear any previous errors. errorLogger.Errors.Clear(); // Create and submit a new asynchronous build request. BuildManager.DefaultBuildManager.BeginBuild(buildParameters); BuildRequestData request = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); submission.ExecuteAsync(null, null); // Wait for the build to finish. submission.WaitHandle.WaitOne(); BuildManager.DefaultBuildManager.EndBuild(); // If the build failed, return an error string. if (submission.BuildResult.OverallResult == BuildResultCode.Failure) { return(string.Join("\n", errorLogger.Errors.ToArray())); } return(null); }
private static Task <BuildResult> ExecuteAsync(this BuildSubmission submission) { var tcs = new TaskCompletionSource <BuildResult>(); submission.ExecuteAsync(s => tcs.SetResult(s.BuildResult), null); return(tcs.Task); }
internal static Task <Microsoft.Build.Execution.BuildResult> ExecuteAsync(this BuildSubmission submission) { var tcs = new TaskCompletionSource <Microsoft.Build.Execution.BuildResult>(); submission.ExecuteAsync(s => tcs.SetResult(s.BuildResult), null); return(tcs.Task); }
public static Task <BuildResult> ExecuteAsync(this BuildSubmission buildSubmission) { var taskCompletionSource = new TaskCompletionSource <BuildResult>(); buildSubmission.ExecuteAsync(BuildSubmissionCompleteCallbackFunction, taskCompletionSource); return(taskCompletionSource.Task); }
private static void build() { buildParameters = new BuildParameters(); BuildManager.DefaultBuildManager.BeginBuild(buildParameters); BuildRequestData request = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); submission.ExecuteAsync(null, null); submission.WaitHandle.WaitOne(); BuildManager.DefaultBuildManager.EndBuild(); }
public void RegisteringLoggerDuringBuildThrowsException() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <Target Name='Test'> <Exec Command='Sleep 1' /> </Target> </Project> "); ProjectInstance project = (new Project(XmlReader.Create(new StringReader(projectBody)))).CreateProjectInstance(); BuildManager buildManager = BuildManager.DefaultBuildManager; MuxLogger muxLogger = new MuxLogger(); BuildParameters parameters = new BuildParameters(ProjectCollection.GlobalProjectCollection); AutoResetEvent projectStartedEvent = new AutoResetEvent(false); parameters.Loggers = new ILogger[] { muxLogger, new EventingLogger(projectStartedEvent) }; MockLogger mockLogger = new MockLogger(); bool gotException = false; buildManager.BeginBuild(parameters); try { BuildSubmission submission = buildManager.PendBuildRequest(new BuildRequestData(project, new string[0], null)); submission.ExecuteAsync(null, null); projectStartedEvent.WaitOne(); try { muxLogger.RegisterLogger(submission.SubmissionId, mockLogger); } catch (InvalidOperationException) { gotException = true; } catch { } } finally { buildManager.EndBuild(); } Assert.True(gotException); // "Failed to get exception registering logger during build." }
/// <summary> /// Builds all the content files which have been added to the project, /// dynamically creating .xnb files in the OutputDirectory. /// Returns an error message if the build fails. /// </summary> public string Build() { // Create and submit a new asynchronous build request. BuildManager.DefaultBuildManager.BeginBuild(buildParameters); BuildRequestData request = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); submission.ExecuteAsync(null, null); // Wait for the build to finish. submission.WaitHandle.WaitOne(); BuildManager.DefaultBuildManager.EndBuild(); return(null); }
public bool Build(string outPath) { BuildManager.DefaultBuildManager.BeginBuild(buildParameters); BuildRequestData request = new BuildRequestData(buildProject.CreateProjectInstance( ), new string[0]); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); submission.ExecuteAsync(null, null); submission.WaitHandle.WaitOne( ); BuildManager.DefaultBuildManager.EndBuild( ); if (submission.BuildResult.OverallResult == BuildResultCode.Failure) { return(false); } this.copyBuiltContent(outPath); Thread.Sleep(250); this.deleteTempDirectory( ); return(true); }
public string Build() { _errorLogger.Errors.Clear(); BuildManager.DefaultBuildManager.BeginBuild(_buildParameters); BuildRequestData request = new BuildRequestData(_buildProject.CreateProjectInstance(), new string[0]); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); submission.ExecuteAsync(null, null); submission.WaitHandle.WaitOne(); BuildManager.DefaultBuildManager.EndBuild(); if (submission.BuildResult.OverallResult == BuildResultCode.Failure) { return(string.Join("\n", _errorLogger.Errors.ToArray())); } return(null); }
public void RegisteringLoggerDuringBuildThrowsException() { string projectBody = ObjectModelHelpers.CleanupFileContents(@" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'> <Target Name='Test'> <Exec Command='Sleep 1' /> </Target> </Project> "); ProjectInstance project = (new Project(XmlReader.Create(new StringReader(projectBody)))).CreateProjectInstance(); BuildManager buildManager = BuildManager.DefaultBuildManager; MuxLogger muxLogger = new MuxLogger(); BuildParameters parameters = new BuildParameters(ProjectCollection.GlobalProjectCollection); AutoResetEvent projectStartedEvent = new AutoResetEvent(false); parameters.Loggers = new ILogger[] { muxLogger, new EventingLogger(projectStartedEvent) }; MockLogger mockLogger = new MockLogger(); buildManager.BeginBuild(parameters); Should.Throw <InvalidOperationException>(() => { try { BuildSubmission submission = buildManager.PendBuildRequest(new BuildRequestData(project, Array.Empty <string>(), null)); submission.ExecuteAsync(null, null); projectStartedEvent.WaitOne(); // This call should throw an InvalidOperationException muxLogger.RegisterLogger(submission.SubmissionId, mockLogger); } finally { buildManager.EndBuild(); } }); }
public string Build() { // Clear any previous errors. _errorLogger.Errors.Clear(); // Create and submit a new asynchronous build request. BuildManager.DefaultBuildManager.BeginBuild(_buildParameters); var request = new BuildRequestData(_buildProject.CreateProjectInstance(), new string[0]); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); submission.ExecuteAsync(null, null); // Wait for the build to finish. submission.WaitHandle.WaitOne(); BuildManager.DefaultBuildManager.EndBuild(); var output = new StringBuilder(); if (submission.BuildResult.OverallResult == BuildResultCode.Failure) { output.Append(string.Join("\n", _errorLogger.Errors.ToArray())); } // handle error output var secondaryImporterErrors = _secondaryImporters.Where(kvp => kvp.Value.Item2.Any()) .Select(kvp => kvp.Value) .SelectMany(item => item.Item2.Select(file => { var errorResult = item.Item1.Invoke(file); return(string.IsNullOrWhiteSpace(errorResult) ? null : string.Format("{0}: {1}\n", file.AssetName, errorResult)); })) .Where(outputString => !string.IsNullOrWhiteSpace(outputString)) .Aggregate("", (acc, item) => acc + "\n" + item); output.AppendLine(secondaryImporterErrors); return(output.ToString()); }
public void Build(string[] projectPaths, string target, bool parallelBuild, int maxNodeCount = 1) { Console.WriteLine("========================================"); BuildParameters buildParameters = new BuildParameters(ProjectCollection.GlobalProjectCollection) { Loggers = new[] { _logger }, MaxNodeCount = maxNodeCount }; if (!parallelBuild) { foreach (string projectPath in projectPaths) { Console.WriteLine("Building {0}...", projectPath); BuildResult buildResult = _buildManager.Build(buildParameters, CreateRequest(projectPath, target)); Console.WriteLine("=====> [{0}] {1}", buildResult.OverallResult, projectPath); } } else { _buildManager.BeginBuild(buildParameters); using (CountdownEvent countdownEvent = new CountdownEvent(projectPaths.Length)) { foreach (string projectPath in projectPaths) { Console.WriteLine("Building {0} in parallel...", projectPath); BuildSubmission submission = _buildManager.PendBuildRequest(CreateRequest(projectPath, target)); submission.ExecuteAsync(o => { Console.WriteLine("=====> [{0}] {1}", o.BuildResult.OverallResult, projectPath); countdownEvent.Signal(); }, null); } countdownEvent.Wait(); } _buildManager.EndBuild(); } }
public bool Build(IVsProject project, BuildCallback buildCallback, BuildLogger buildLogger, string platform, string configuration) { return(project.WithProject((MSBuildProject msproject) => { // // We need to set this before we acquire the build resources otherwise Msbuild // will not see the changes. // bool onlyLogCriticalEvents = msproject.ProjectCollection.OnlyLogCriticalEvents; msproject.ProjectCollection.Loggers.Add(buildLogger); msproject.ProjectCollection.OnlyLogCriticalEvents = false; uint cookie; int err = BuildManagerAccessor.AcquireBuildResources(VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_DESIGNTIME | VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_UITHREAD, out cookie); if (err != VSConstants.E_PENDING && err != VSConstants.S_OK) { ErrorHandler.ThrowOnFailure(err); } if (err == VSConstants.E_PENDING) { msproject.ProjectCollection.Loggers.Remove(buildLogger); msproject.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents; Dispatcher = Dispatcher.CurrentDispatcher; BuildAvailableEvent = new ManualResetEvent(false); BuildAvailableEvent.SafeWaitHandle = new SafeWaitHandle(BuildManagerAccessor.DesignTimeBuildAvailable, false); Thread t = new Thread(() => { BuildAvailableEvent.WaitOne(); Dispatcher.BeginInvoke(new Action(() => { Package.Instance.BuildNextProject(); })); }); t.Start(); return false; } else { try { Dictionary <string, string> properties = new Dictionary <string, string>(); properties["Platform"] = platform; properties["Configuration"] = configuration; BuildRequestData buildRequest = new BuildRequestData( msproject.FullPath, properties, null, new string[] { "SliceCompile" }, msproject.ProjectCollection.HostServices, BuildRequestDataFlags.ProvideProjectStateAfterBuild | BuildRequestDataFlags.IgnoreExistingProjectState | BuildRequestDataFlags.ReplaceExistingProjectInstance); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequest); ErrorHandler.ThrowOnFailure(BuildManagerAccessor.RegisterLogger(submission.SubmissionId, buildLogger)); Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => { buildCallback.BeginBuild(platform, configuration); })); submission.ExecuteAsync(s => { Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => { msproject.ProjectCollection.Loggers.Remove(buildLogger); msproject.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents; BuildManagerAccessor.ReleaseBuildResources(cookie); s.BuildManager.ResetCaches(); BuildManagerAccessor.UnregisterLoggers(s.SubmissionId); buildCallback.EndBuild(s.BuildResult.OverallResult == BuildResultCode.Success); })); }, null); return true; } catch (Exception) { msproject.ProjectCollection.Loggers.Remove(buildLogger); msproject.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents; BuildManagerAccessor.ReleaseBuildResources(cookie); throw; } } })); }
public bool Build(IVsProject p, BuildCallback buildCallback, BuildLogger buildLogger) { MSBuildProject project = MSBuildUtils.LoadedProject(ProjectUtil.GetProjectFullPath(p), DTEUtil.IsCppProject(p), false); // // We need to set this before we acquire the build resources otherwise Msbuild // will not see the changes. // bool onlyLogCriticalEvents = project.ProjectCollection.OnlyLogCriticalEvents; project.ProjectCollection.Loggers.Add(buildLogger); project.ProjectCollection.OnlyLogCriticalEvents = false; uint cookie; int err = BuildManagerAccessor.AcquireBuildResources(VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_DESIGNTIME | VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_UITHREAD, out cookie); if (err != VSConstants.E_PENDING && err != VSConstants.S_OK) { ErrorHandler.ThrowOnFailure(err); } if (err == VSConstants.E_PENDING) { project.ProjectCollection.Loggers.Remove(buildLogger); project.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents; Dispatcher = Dispatcher.CurrentDispatcher; BuildAvailableEvent = new System.Threading.ManualResetEvent(false); BuildAvailableEvent.SafeWaitHandle = new SafeWaitHandle(BuildManagerAccessor.DesignTimeBuildAvailable, false); Thread t = new Thread(() => { BuildAvailableEvent.WaitOne(); Dispatcher.BeginInvoke(new Action(() => { Package.Instance.BuildNextProject(); })); }); t.Start(); return(false); } else { try { Dictionary <string, string> properties = new Dictionary <string, string>(); String platform = buildCallback.ProjectConfiguration.PlatformName; properties["Platform"] = platform.Equals("Any CPU") ? "AnyCPU" : platform; properties["Configuration"] = buildCallback.ProjectConfiguration.ConfigurationName; BuildRequestData buildRequest = new BuildRequestData( ProjectUtil.GetProjectFullPath(p), properties, null, new String[] { "IceBuilder_Compile" }, project.ProjectCollection.HostServices, BuildRequestDataFlags.IgnoreExistingProjectState | BuildRequestDataFlags.ReplaceExistingProjectInstance); BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequest); ErrorHandler.ThrowOnFailure(BuildManagerAccessor.RegisterLogger(submission.SubmissionId, buildLogger)); buildCallback.BeginBuild(); submission.ExecuteAsync((s) => { Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => { project.ProjectCollection.Loggers.Remove(buildLogger); project.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents; BuildManagerAccessor.ReleaseBuildResources(cookie); BuildManagerAccessor.UnregisterLoggers(submission.SubmissionId); buildCallback.EndBuild(submission.BuildResult.OverallResult == BuildResultCode.Success); })); }, null); return(true); } catch (Exception) { project.ProjectCollection.Loggers.Remove(buildLogger); project.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents; BuildManagerAccessor.ReleaseBuildResources(cookie); throw; } } }