コード例 #1
0
        private static Task <BuildResult> ExecuteAsync(this BuildSubmission submission)
        {
            var tcs = new TaskCompletionSource <BuildResult>();

            submission.ExecuteAsync(s => tcs.SetResult(s.BuildResult), null);
            return(tcs.Task);
        }
コード例 #2
0
        public bool Build(string solutionDirectory, string outputPath)
        {
            string projectFilePath = Path.Combine(solutionDirectory);

            ProjectCollection pc = new ProjectCollection();

            // THERE ARE A LOT OF PROPERTIES HERE, THESE MAP TO THE MSBUILD CLI PROPERTIES
            Dictionary <string, string> globalProperty = new Dictionary <string, string>();

            globalProperty.Add("OutputPath", outputPath);
            globalProperty.Add("Configuration", "Debug");
            globalProperty.Add("Platform", "Any CPU");

            BuildParameters bp = new BuildParameters(pc);

            bp.Loggers = new[] {
                new FileLogger
                {
                    Verbosity              = LoggerVerbosity.Detailed,
                    ShowSummary            = true,
                    SkipProjectStartedText = true
                }
            };
            BuildManager.DefaultBuildManager.BeginBuild(bp);

            BuildRequestData BuildRequest = new BuildRequestData(projectFilePath, globalProperty, "4.7", new string[] { "Build" }, null);

            BuildSubmission BuildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(BuildRequest);

            BuildSubmission.Execute();
            BuildManager.DefaultBuildManager.EndBuild();

            return(BuildSubmission.BuildResult.OverallResult == BuildResultCode.Success ? true : false);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        private static BuildResult Build(BuildRequestData buildRequestData, IEnumerable <ILogger> loggers)
        {
            lock (LockObject)
            {
                BuildParameters buildParameters = new BuildParameters
                {
                    EnableNodeReuse = false,
                    MaxNodeCount    = Environment.ProcessorCount,
                    ResetCaches     = true,
                    Loggers         = loggers,
                };

                BuildManager.DefaultBuildManager.BeginBuild(buildParameters);

                try
                {
                    BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequestData);

                    SetCurrentHost(BuildManager.DefaultBuildManager);

                    BuildResult buildResult = buildSubmission.Execute();

                    if (buildResult.Exception != null)
                    {
                        throw buildResult.Exception;
                    }

                    return(buildResult);
                }
                finally
                {
                    BuildManager.DefaultBuildManager.EndBuild();
                }
            }
        }
コード例 #5
0
        private void Build(string[] targets, BuildOutput buildOutput, out bool result, out IDictionary <string, TargetResult> targetOutputs)
        {
            lock (BuildManager.DefaultBuildManager)
            {
                BuildRequestData restoreRequest = new BuildRequestData(
                    ProjectInstance,
                    targetsToBuild: targets ?? ProjectInstance.DefaultTargets.ToArray(),
                    hostServices: null,
                    flags: BuildRequestDataFlags.ReplaceExistingProjectInstance);

                BuildParameters buildParameters = new BuildParameters
                {
                    Loggers = new List <Framework.ILogger>(ProjectCollection.Loggers.Concat(buildOutput.AsEnumerable())),
                };

                BuildManager.DefaultBuildManager.BeginBuild(buildParameters);
                try
                {
                    BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(restoreRequest);

                    BuildResult buildResult = buildSubmission.Execute();

                    result = buildResult.OverallResult == BuildResultCode.Success;

                    targetOutputs = buildResult.ResultsByTarget;
                }
                finally
                {
                    BuildManager.DefaultBuildManager.EndBuild();
                }
            }
        }
コード例 #6
0
ファイル: Extensions.cs プロジェクト: kovalikp/PowerBuild
        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);
        }
コード例 #7
0
        public static Task <BuildResult> ExecuteAsync(this BuildSubmission submission)
        {
            var tcs = new TaskCompletionSource <BuildResult>();

            submission.ExecuteAsync(SetBuildComplete, tcs);
            return(tcs.Task);
        }
コード例 #8
0
        public static Task <BuildResult> ExecuteAsync(this BuildSubmission buildSubmission)
        {
            var taskCompletionSource = new TaskCompletionSource <BuildResult>();

            buildSubmission.ExecuteAsync(BuildSubmissionCompleteCallbackFunction, taskCompletionSource);
            return(taskCompletionSource.Task);
        }
コード例 #9
0
        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();
        }
コード例 #10
0
        public override bool Build(string projectFileName, string[] targetNames, IDictionary targetOutputs)
        {
            try
            {
                this.buildManager.BeginBuild(this.buildParameters);

                BuildRequestData buildRequestData = new BuildRequestData(this.currentProjectInstance, targetNames, null, BuildRequestDataFlags.ReplaceExistingProjectInstance);

                BuildSubmission submission = this.buildManager.PendBuildRequest(buildRequestData);

                BuildResult buildResult = submission.Execute();

                bool buildSucceeded = buildResult.OverallResult == BuildResultCode.Success;

                this.buildManager.EndBuild();

                // Fill in empty lists for each target so that heat will look at the item group later.
                foreach (string target in targetNames)
                {
                    targetOutputs.Add(target, new List <object>());
                }

                return(buildSucceeded);
            }
            catch (Exception e)
            {
                throw new WixException(VSErrors.CannotBuildProject(projectFileName, e.Message));
            }
        }
コード例 #11
0
        // FIXME: take max nodes into account here, and get throttling working.
        BuildNode TakeNode(BuildSubmission build)
        {
            var          host = BuildManager.OngoingBuildParameters.HostServices;
            NodeAffinity affinity;

            if (host == null)
            {
                affinity = NodeAffinity.Any;
            }
            else
            {
                affinity = host.GetNodeAffinity(build.BuildRequest.ProjectFullPath);
            }
            BuildNode n = GetReusableNode(affinity);

            if (n != null)
            {
                n.Assign(build);
            }
            else
            {
                n = new BuildNode(this, affinity == NodeAffinity.Any ? NodeAffinity.InProc : affinity);
                n.Assign(build);
                if (n.Affinity == NodeAffinity.InProc)
                {
                    in_proc_nodes.Add(n);
                }
                else
                {
                    out_proc_nodes.Add(n);
                }
            }
            return(n);
        }
コード例 #12
0
        void StartOneBuild(BuildSubmission build)
        {
            var node = TakeNode(build);

            // FIXME: Task (non-generic) here causes NotImplementedException in somewhere in Interlocked. It does not make sense.
            ongoing_builds [build] = task_factory.StartNew(node.ExecuteBuild);
            //new Thread (() => { node.ExecuteBuild (); }).Start ();
        }
コード例 #13
0
        // no loggers
        internal static bool BuildInstance(ProjectNode projectNode, ProjectInstance instance, string target)
        {
            BuildSubmission submission = projectNode.DoMSBuildSubmission(BuildKind.Sync, target, ref instance, null);

            if (submission == null)
            {
                return(false);
            }
            return(submission.BuildResult.OverallResult == BuildResultCode.Success);
        }
コード例 #14
0
        public void BuildWithMuxLoggerEquivalentToNormalLogger()
        {
            string projectBody = ObjectModelHelpers.CleanupFileContents(@"
<Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'>
    <Target Name='Test'>
        <Message Text='Foo'/>
        <Error Text='Error'/>
    </Target>
</Project>
");

            BuildManager buildManager = BuildManager.DefaultBuildManager;

            // Build with a 'normal' logger
            MockLogger mockLogger2 = new MockLogger();

            mockLogger2.LogBuildFinished = false;
            ProjectCollection projectCollection = new ProjectCollection();
            ProjectInstance   project           = (new Project(XmlReader.Create(new StringReader(projectBody)), null, "4.0", projectCollection)).CreateProjectInstance();
            BuildParameters   parameters        = new BuildParameters(projectCollection);

            parameters.Loggers = new ILogger[] { mockLogger2 };
            buildManager.Build(parameters, new BuildRequestData(project, new string[0], null));

            // Build with the mux logger
            MuxLogger muxLogger = new MuxLogger();

            muxLogger.Verbosity = LoggerVerbosity.Normal;
            projectCollection   = new ProjectCollection();
            project             = (new Project(XmlReader.Create(new StringReader(projectBody)), null, "4.0", projectCollection)).CreateProjectInstance();
            parameters          = new BuildParameters(projectCollection);
            parameters.Loggers  = new ILogger[] { muxLogger };
            buildManager.BeginBuild(parameters);
            MockLogger mockLogger = new MockLogger();

            mockLogger.LogBuildFinished = false;

            try
            {
                BuildSubmission submission = buildManager.PendBuildRequest(new BuildRequestData(project, new string[0], null));
                muxLogger.RegisterLogger(submission.SubmissionId, mockLogger);
                submission.Execute();
            }
            finally
            {
                buildManager.EndBuild();
            }

            Assert.True(mockLogger2.BuildFinishedEvents.Count > 0);
            Assert.Equal(mockLogger2.BuildFinishedEvents.Count, mockLogger.BuildFinishedEvents.Count);
            Assert.Equal(mockLogger2.BuildFinishedEvents[0].Succeeded, mockLogger.BuildFinishedEvents[0].Succeeded);
            Assert.Equal(mockLogger2.FullLog, mockLogger.FullLog);
        }
コード例 #15
0
 public BuildEngine4(BuildSubmission submission)
 {
     this.submission = submission;
     event_source    = new Microsoft.Build.BuildEngine.EventSource();
     if (submission.BuildManager.OngoingBuildParameters.Loggers != null)
     {
         foreach (var l in submission.BuildManager.OngoingBuildParameters.Loggers)
         {
             l.Initialize(event_source);
         }
     }
 }
コード例 #16
0
ファイル: ModelBuilder.cs プロジェクト: luodua/PokemonAzure
        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();
        }
コード例 #17
0
        /// <summary>
        /// Attempts to run the Restore target for the current project with a unique evaluation context.
        /// </summary>
        /// <param name="result">A value indicating the result of the restore.</param>
        /// <param name="buildOutput">A <see cref="BuildOutput"/> object that captured the logging from the restore.</param>
        /// <param name="targetOutputs">A <see cref="IDictionary{String,TargetResult}" /> containing the target outputs.</param>
        /// <returns>The current <see cref="ProjectCreator"/>.</returns>
        public ProjectCreator TryRestore(out bool result, out BuildOutput buildOutput, out IDictionary <string, TargetResult> targetOutputs)
        {
            Save();

            buildOutput = BuildOutput.Create();

            lock (BuildManager.DefaultBuildManager)
            {
                BuildRequestData restoreRequest = new BuildRequestData(
                    FullPath,
                    new Dictionary <string, string>
                {
                    ["ExcludeRestorePackageImports"] = "true",
                    ["MSBuildRestoreSessionId"]      = Guid.NewGuid().ToString("D"),
                },
                    ProjectCollection.DefaultToolsVersion,
                    targetsToBuild: new[] { "Restore" },
                    hostServices: null,
                    flags: BuildRequestDataFlags.ClearCachesAfterBuild | BuildRequestDataFlags.SkipNonexistentTargets | BuildRequestDataFlags.IgnoreMissingEmptyAndInvalidImports);

                BuildParameters buildParameters = new BuildParameters
                {
                    Loggers = new List <Framework.ILogger>
                    {
                        buildOutput,
                    },
                };

                BuildManager.DefaultBuildManager.BeginBuild(buildParameters);
                try
                {
                    BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(restoreRequest);

                    BuildResult buildResult = buildSubmission.Execute();

                    result = buildResult.OverallResult == BuildResultCode.Success;

                    targetOutputs = buildResult.ResultsByTarget;
                }
                finally
                {
                    BuildManager.DefaultBuildManager.EndBuild();
                }
            }

            Project.MarkDirty();

            Project.ReevaluateIfNecessary();

            return(this);
        }
コード例 #18
0
        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."
        }
コード例 #19
0
        public void OneSubmissionTwoLoggers()
        {
            string          projectBody = ObjectModelHelpers.CleanupFileContents(@"
<Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'>
    <Target Name='Test'>
        <Message Text='Foo'/>
        <Error Text='Error'/>
    </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);

            parameters.Loggers = new ILogger[] { muxLogger };
            MockLogger mockLogger1 = new MockLogger();
            MockLogger mockLogger2 = new MockLogger();

            buildManager.BeginBuild(parameters);
            try
            {
                BuildSubmission submission = buildManager.PendBuildRequest(new BuildRequestData(project, new string[0], null));

                muxLogger.RegisterLogger(submission.SubmissionId, mockLogger1);
                muxLogger.RegisterLogger(submission.SubmissionId, mockLogger2);
                submission.Execute();
            }
            finally
            {
                buildManager.EndBuild();
            }

            mockLogger1.AssertLogContains("Foo");
            mockLogger1.AssertLogContains("Error");
            Assert.Equal(1, mockLogger1.ErrorCount);
            mockLogger1.AssertNoWarnings();

            mockLogger2.AssertLogContains("Foo");
            mockLogger2.AssertLogContains("Error");
            Assert.Equal(1, mockLogger2.ErrorCount);
            mockLogger2.AssertNoWarnings();

            Assert.Equal(mockLogger1.FullLog, mockLogger2.FullLog);
        }
コード例 #20
0
 private void SetTaskCompletionResult(BuildSubmission buildSubmission, TaskCompletionSource <BuildResult> tcs)
 {
     if (buildSubmission.BuildResult.Exception != null)
     {
         if (buildSubmission.BuildResult.Exception is BuildAbortedException)
         {
             tcs.SetCanceled();
         }
         else
         {
             tcs.TrySetException(buildSubmission.BuildResult.Exception);
         }
     }
     else
     {
         tcs.SetResult(buildSubmission.BuildResult);
     }
 }
コード例 #21
0
        /// <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);
        }
コード例 #22
0
        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);
        }
コード例 #23
0
ファイル: ContentBuilder.cs プロジェクト: Jorch72/CS-Treefrog
        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);
        }
コード例 #24
0
        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());
        }
コード例 #25
0
        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();
                }
            });
        }
コード例 #26
0
        private bool BuildProject(Project buildProject)
        {
            OnError("Compiling project...");

            // Create and submit a new asynchronous build request.
            BuildParameters buildParameters = new BuildParameters(ProjectCollection.GlobalProjectCollection)
            {
                Loggers = new ILogger[] { new ErrorLogger(OnError) }
            };

            BuildManager.DefaultBuildManager.BeginBuild(buildParameters);

            BuildRequestData request    = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]);
            BuildSubmission  submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);
            BuildResult      result     = submission.Execute();

            BuildManager.DefaultBuildManager.EndBuild();

            OnError("Project compilation complete.");

            return(result.OverallResult == BuildResultCode.Success);
        }
コード例 #27
0
        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();
            }
        }
コード例 #28
0
        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;
                    }
                }
            }));
        }
コード例 #29
0
ファイル: BuildAssemblyTask.cs プロジェクト: maryasov/server
        public override async Task <bool> Process(Resource resource)
        {
            var solution = Path.Combine(resource.Path, resource.Info["clr_solution"]);

            // set global properties
            var globalProperties = new Dictionary <string, string>();

            globalProperties["Configuration"]          = "Release";
            globalProperties["OutputPath"]             = Path.GetFullPath(Path.Combine(Path.Combine(Program.RootDirectory, "cache/resource_bin"), resource.Name)) + "/";
            globalProperties["IntermediateOutputPath"] = Path.GetFullPath(Path.Combine(Path.Combine(Program.RootDirectory, "cache/resource_obj"), resource.Name)) + "/";
            globalProperties["OutDir"] = globalProperties["OutputPath"]; // for Mono?

            try
            {
                // prepare the project file
                var projectRoot = ProjectRootElement.Open(Path.GetFullPath(solution));

                // disable any Citizen profiles
                foreach (var property in projectRoot.Properties)
                {
                    if (property.Name == "TargetFrameworkProfile")
                    {
                        property.Value = "";
                    }
                }

                // we don't want the system mscorlib
                projectRoot.AddProperty("NoStdLib", "true");

                // add hint paths for all references
                Func <string, string> getPath = a => Path.GetFullPath(Path.Combine(Path.Combine(Program.RootDirectory, "system/clrcore"), a + ".dll"));

                foreach (var item in projectRoot.Items)
                {
                    if (item.ItemType == "Reference")
                    {
                        // remove existing hint paths
                        item.Metadata.Where(a => a.Name == "HintPath").ToList().ForEach(a => item.RemoveChild(a));

                        item.AddMetadata("HintPath", getPath(item.Include));
                        item.AddMetadata("Private", "false");
                    }
                }

                // add our own mscorlib
                projectRoot.AddItem("Reference", "mscorlib", new Dictionary <string, string>()
                {
                    { "HintPath", getPath("mscorlib") },
                    { "Private", "false" }
                });

                // create an instance and build request
                var projectInstance = new ProjectInstance(projectRoot, globalProperties, "4.0", ProjectCollection.GlobalProjectCollection);
                var buildRequest    = new BuildRequestData(projectInstance, new[] { "Build" }, null);

                BuildSubmission buildSubmission = null;

                // run this in a separate task
                await Task.Run(() =>
                {
                    // building is mutually-exclusive thanks to MSBuild working directory affinity
                    lock (_compileLock)
                    {
                        // set the working directory
                        var oldDirectory             = Environment.CurrentDirectory;
                        Environment.CurrentDirectory = Path.GetFullPath(Path.GetDirectoryName(solution));

                        // set the build parameters
                        var buildParameters     = new BuildParameters();
                        buildParameters.Loggers = new[] { this };

                        BuildManager.DefaultBuildManager.BeginBuild(buildParameters);

                        // create a build submission and execute
                        buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequest);
                        buildSubmission.Execute();

                        // end building
                        BuildManager.DefaultBuildManager.EndBuild();

                        // put the current directory back
                        Environment.CurrentDirectory = oldDirectory;
                    }
                });

                this.Log().Info("Build for {0} complete - result: {1}", resource.Name, buildSubmission.BuildResult.OverallResult);

                var success = (buildSubmission.BuildResult.OverallResult == BuildResultCode.Success);

                if (success)
                {
                    // the targets producing 'interesting' items (resource_bin/*.dll)
                    var targetList = new[] { "Build", "CoreBuild" }; // CoreBuild is needed on Mono

                    // callback to run on each target
                    Action <TargetResult> iterateResult = buildResult =>
                    {
                        if (buildResult.Items != null)
                        {
                            foreach (var item in buildResult.Items)
                            {
                                var baseName = Path.GetFileName(item.ItemSpec);

                                resource.ExternalFiles[string.Format("bin/{0}", baseName)] = new FileInfo(item.ItemSpec);
                            }
                        }
                    };

                    // loop through the targets
                    foreach (var target in targetList)
                    {
                        TargetResult result;

                        // if it's a resulting target
                        if (buildSubmission.BuildResult.ResultsByTarget.TryGetValue(target, out result))
                        {
                            iterateResult(result);
                        }
                    }
                }
                else
                {
                    foreach (var logItem in m_logDump)
                    {
                        this.Log().Error(logItem);
                    }
                }

                m_logDump.Clear();

                // unload the project so it will not get cached
                ProjectCollection.GlobalProjectCollection.UnloadProject(projectRoot);

                return(success);
            }
            catch (Exception e)
            {
                this.Log().Error(() => "Building assembly failed: " + e.Message, e);

                return(false);
            }
        }
コード例 #30
0
        private static void SetBuildComplete(BuildSubmission submission)
        {
            var tcs = (TaskCompletionSource <BuildResult>)submission.AsyncContext;

            tcs.SetResult(submission.BuildResult);
        }