コード例 #1
0
ファイル: MSBuild.cs プロジェクト: NN---/nuproj
        /// <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);
        }
コード例 #2
0
ファイル: BuildSubmissionTest.cs プロジェクト: GirlD/mono
		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");
		}
コード例 #3
0
        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);
        }
コード例 #4
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();
        }
コード例 #5
0
		static IDisposable beginBuild(BuildManager buildManager, BuildParameters parameters)
		{
			buildManager.BeginBuild(parameters);
			return new DisposeAction(buildManager.EndBuild);
		}
コード例 #6
0
ファイル: MSBuild.cs プロジェクト: NN---/nuproj
        /// <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);
        }
コード例 #7
0
ファイル: BuildSubmissionTest.cs プロジェクト: GirlD/mono
		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");
		}
コード例 #8
0
        /// <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;
        }
コード例 #9
0
ファイル: BuildManagerTest.cs プロジェクト: GirlD/mono
		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.
			}
		}
コード例 #10
0
ファイル: BuildManagerTest.cs プロジェクト: GirlD/mono
		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");
		}
コード例 #11
0
ファイル: Program.cs プロジェクト: danni95/Core
        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);
            }
        }