Пример #1
0
        public void InvalidProjectsLogGoodInfo()
        {
            ProjectCreator projectA = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Import(@"$(Foo)\foo.props")
                                      .Save();

            ProjectCreator dirsProj = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Property("IsTraversal", "true")
                                      .ItemInclude("ProjectFile", projectA.FullPath)
                                      .Save();

            BuildEngine buildEngine = BuildEngine.Create();

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, buildEngine);

            loader.LoadProjectsAndReferences(new[] { dirsProj.FullPath });

            BuildErrorEventArgs errorEventArgs = buildEngine.ErrorEvents.ShouldHaveSingleItem();

            errorEventArgs.Code.ShouldBe("MSB4019");
            errorEventArgs.ColumnNumber.ShouldBe(3);
            errorEventArgs.HelpKeyword.ShouldBe("MSBuild.ImportedProjectNotFound");
            errorEventArgs.LineNumber.ShouldBe(3);
            errorEventArgs.File.ShouldBe(projectA.FullPath);
        }
        public void InvalidProjectsLogGoodInfo()
        {
            var projectA = ProjectBuilder
                           .Create()
                           .AddImport(new Import(@"$(Foo)\foo.props"))
                           .Save(GetTempFileName());

            var dirsProj = ProjectBuilder
                           .Create()
                           .AddProperty("IsTraversal=true")
                           .AddItem($"ProjectFile={projectA.FullPath}")
                           .Save(GetTempFileName());

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, Log);

            loader.LoadProjectsAndReferences(new[] { dirsProj.FullPath });

            var errorEventArgs = _buildEngine.Errors.ShouldHaveSingleItem();

            errorEventArgs.Code.ShouldBe("MSB4019");
            errorEventArgs.ColumnNumber.ShouldBe(3);
            errorEventArgs.HelpKeyword.ShouldBe("MSBuild.ImportedProjectNotFound");
            errorEventArgs.LineNumber.ShouldBe(3);
            errorEventArgs.File.ShouldBe(projectA.FullPath);
        }
Пример #3
0
        public void TraversalReferencesWork()
        {
            ProjectCreator projectB = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Save();

            ProjectCreator projectA = ProjectCreator
                                      .Create(GetTempFileName())
                                      .ItemProjectReference(projectB)
                                      .Save();

            ProjectCreator dirsProj = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Property("IsTraversal", "true")
                                      .ItemInclude("ProjectFile", projectA.FullPath)
                                      .Save();

            BuildEngine buildEngine = BuildEngine.Create();

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, buildEngine);

            ProjectCollection projectCollection = loader.LoadProjectsAndReferences(new[] { dirsProj.FullPath });

            projectCollection.LoadedProjects.Select(i => i.FullPath).ShouldBe(
                new[] { dirsProj.FullPath, projectA.FullPath, projectB.FullPath },
                ignoreOrder: true);
        }
 public MSBuildSolutionProjectAnalyzer(string[] includedSolutions = null)
     : base(includedSolutions)
 {
     loader = new MSBuildProjectLoader(new AdhocWorkspace(DesktopMefHostServices.DefaultServices))
     {
         SkipUnrecognizedProjects = true,
     };
 }
Пример #5
0
        public void ArgumentNullException_BuildEngine()
        {
            ArgumentNullException exception = Should.Throw <ArgumentNullException>(() =>
            {
                MSBuildProjectLoader unused = new MSBuildProjectLoader(globalProperties: null, toolsVersion: null, buildEngine: null);
            });

            exception.ParamName.ShouldBe("buildEngine");
        }
Пример #6
0
        private void LogStatistics(MSBuildProjectLoader projectLoader)
        {
            LogMessageLow("SlnGen Project Evaluation Performance Summary:");

            foreach (KeyValuePair <string, TimeSpan> item in projectLoader.Statistics.ProjectLoadTimes.OrderByDescending(i => i.Value))
            {
                LogMessageLow($"  {Math.Round(item.Value.TotalMilliseconds, 0)} ms  {item.Key}", MessageImportance.Low);
            }
        }
Пример #7
0
        public bool Execute(string file, string projectsFile, string msBuildVersion, bool requireConsent, bool disableParallelProcessing, string[] fallbackSources, bool noCache, string packageSaveMode, string[] sources, string configFile, bool nonInteractive, string verbosity, int timeout, string toolPath, bool enableOptimization, string markerPath, string[] inputs, string msbuildToolsVersion, string project, string globalProperties, string msbuildPath, string additionalArguments)
        {
            if (BuildEngine == null)
            {
                BuildEngine = new CBTBuildEngine();
            }

            MSBuildToolsVersion = msbuildToolsVersion;
            Project             = project;
            GlobalProperties    = globalProperties;
            File = file;

            FileInfo projectsFileInfo = !String.IsNullOrWhiteSpace(projectsFile) ? new FileInfo(projectsFile) : null;

            inputs = inputs.Concat(GetAllPathsFromProjectsFile(projectsFileInfo)).ToArray();

            if (enableOptimization && IsFileUpToDate(Log, markerPath, inputs))
            {
                Log.LogMessage(MessageImportance.Low, "Traversal NuGet packages are up-to-date");
                return(true);
            }

            MSBuildProjectLoader projectLoader = new MSBuildProjectLoader(GlobalProperties.Split(new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries).Where(i => !String.IsNullOrWhiteSpace(i)).Select(i => i.Trim().Split(new[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries)).ToDictionary(i => i.First(), i => i.Last()), MSBuildToolsVersion, Log, ProjectLoadSettings.IgnoreMissingImports);

            Log.LogMessage(MessageImportance.Normal, $"Loading project references for '{Project}'...");
            _projectCollection  = projectLoader.LoadProjectsAndReferences(new[] { Project });
            _enableOptimization = enableOptimization;

            Log.LogMessage(MessageImportance.Low, "10 Slowest Loading Projects:");
            foreach (var loadTimes in projectLoader.Statistics.ProjectLoadTimes.OrderByDescending(i => i.Value).Take(10))
            {
                Log.LogMessage(MessageImportance.Low, $"  {loadTimes.Key} {loadTimes.Value}");
            }

            if (Log.HasLoggedErrors)
            {
                return(false);
            }

            Log.LogMessage(MessageImportance.Normal, $"Loaded '{_projectCollection.LoadedProjects.Count}' projects");

            if (!TryWriteSolutionFile(_projectCollection))
            {
                return(false);
            }

            if (projectsFileInfo != null && !TryWriteProjectsFile(_projectCollection, projectsFileInfo))
            {
                return(false);
            }

            bool ret = Execute(file, msBuildVersion, requireConsent, disableParallelProcessing, fallbackSources, noCache, packageSaveMode, sources, configFile, nonInteractive, verbosity, timeout, toolPath, enableOptimization, markerPath, inputs, msbuildPath, additionalArguments);

            return(ret && !Log.HasLoggedErrors);
        }
Пример #8
0
        public void BuildFailsIfError()
        {
            ProjectCreator dirsProj = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Property("IsTraversal", "true")
                                      .ItemInclude("ProjectFile", "does not exist")
                                      .Save();

            BuildEngine buildEngine = BuildEngine.Create();

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, buildEngine);

            loader.LoadProjectsAndReferences(new[] { dirsProj.FullPath });

            buildEngine.Errors.ShouldHaveSingleItem().ShouldStartWith("The project file could not be loaded. Could not find file ");
        }
        public void ProjectReferencesWork()
        {
            var projectB = ProjectBuilder.Create()
                           .Save(GetTempFileName());

            var projectA = ProjectBuilder
                           .Create()
                           .AddProjectReference(projectB)
                           .Save(GetTempFileName());

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, Log);

            ProjectCollection projectCollection = loader.LoadProjectsAndReferences(new[] { projectA.FullPath });

            projectCollection.LoadedProjects.Select(i => i.FullPath).ShouldBe(new[] { projectA.FullPath, projectB.FullPath });
        }
        public void GlobalPropertiesSetCorrectly()
        {
            Dictionary <string, string> expectedGlobalProperties = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase)
            {
                { "Property1", "1A836FEB3ABA43B183034DFDD5C4E375" },
                { "Property2", "CEEC5C9FF0F344DAA32A0F545460EB2C" }
            };

            var projectA = ProjectBuilder
                           .Create()
                           .Save(GetTempFileName());

            MSBuildProjectLoader loader = new MSBuildProjectLoader(expectedGlobalProperties, MSBuildToolsVersion, Log);

            ProjectCollection projectCollection = loader.LoadProjectsAndReferences(new[] { projectA.FullPath });

            projectCollection.GlobalProperties.ShouldBe(expectedGlobalProperties);
        }
Пример #11
0
        public void ProjectReferencesWork()
        {
            ProjectCreator projectB = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Save();

            ProjectCreator projectA = ProjectCreator
                                      .Create(GetTempFileName())
                                      .ItemProjectReference(projectB)
                                      .Save();

            BuildEngine buildEngine = BuildEngine.Create();

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, buildEngine);

            ProjectCollection projectCollection = loader.LoadProjectsAndReferences(new[] { projectA.FullPath });

            projectCollection.LoadedProjects.Select(i => i.FullPath).ShouldBe(new[] { projectA.FullPath, projectB.FullPath });
        }
        public void GlobalPropertiesSetCorrectly()
        {
            Dictionary <string, string> expectedGlobalProperties = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase)
            {
                ["Property1"] = "1A836FEB3ABA43B183034DFDD5C4E375",
                ["Property2"] = "CEEC5C9FF0F344DAA32A0F545460EB2C",
            };

            ProjectCreator projectA = ProjectCreator
                                      .Create(GetTempFileName())
                                      .Save();

            BuildEngine buildEngine = BuildEngine.Create();

            MSBuildProjectLoader loader = new MSBuildProjectLoader(expectedGlobalProperties, ProjectCollection.GlobalProjectCollection.DefaultToolsVersion, buildEngine);

            ProjectCollection projectCollection = loader.LoadProjectsAndReferences(new[] { projectA.FullPath });

            projectCollection.GlobalProperties.ShouldBe(expectedGlobalProperties);
        }
Пример #13
0
        private ProjectCollection LoadProjectsAndReferences(IDictionary <string, string> globalProperties)
        {
            // Create an MSBuildProject loader with the same global properties of the project that requested a solution file
            MSBuildProjectLoader projectLoader = new MSBuildProjectLoader(globalProperties, ToolsVersion, BuildEngine, ProjectLoadSettings.IgnoreMissingImports)
            {
                CollectStats = CollectStats
            };

            LogMessageHigh("Loading project references...");

            ProjectCollection projectCollection = projectLoader.LoadProjectsAndReferences(ProjectReferences.Select(i => i.GetMetadata("FullPath")).Concat(new[] { ProjectFullPath }));

            LogMessageNormal($"Loaded {projectCollection.LoadedProjects.Count} project(s)");

            if (CollectStats)
            {
                LogStatistics(projectLoader);
            }

            return(projectCollection);
        }
        public void BuildFailsIfError()
        {
            var dirsProj = ProjectBuilder
                           .Create()
                           .AddProperty("IsTraversal=true")
                           .AddItem("ProjectFile=does not exist")
                           .Save(GetTempFileName());

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, Log);

            loader.LoadProjectsAndReferences(new[] { dirsProj.FullPath });

            Log.HasLoggedErrors.ShouldBe(true);

            _buildEngine.LoggedEvents.Count.ShouldBe(1);
            BuildErrorEventArgs errorEvent = _buildEngine.LoggedEvents.FirstOrDefault() as BuildErrorEventArgs;

            errorEvent.ShouldNotBeNull();

            errorEvent?.Message.ShouldStartWith("The project file could not be loaded. Could not find file ");
        }
        public void TraversalReferencesWork()
        {
            var projectB = ProjectBuilder.Create()
                           .Save(GetTempFileName());

            var projectA = ProjectBuilder
                           .Create()
                           .AddProjectReference(projectB)
                           .Save(GetTempFileName());

            var dirsProj = ProjectBuilder
                           .Create()
                           .AddProperty("IsTraversal=true")
                           .AddItem($"ProjectFile={projectA.FullPath}")
                           .Save(GetTempFileName());

            MSBuildProjectLoader loader = new MSBuildProjectLoader(null, MSBuildToolsVersion, Log);

            ProjectCollection projectCollection = loader.LoadProjectsAndReferences(new[] { dirsProj.FullPath });

            projectCollection.LoadedProjects.Select(i => i.FullPath).ShouldBe(new[] { dirsProj.FullPath, projectA.FullPath, projectB.FullPath });
        }
Пример #16
0
        protected override async Task <CommandResult> ExecuteAsync(
            string path,
            MSBuildWorkspace workspace,
            IProgress <ProjectLoadProgress> progress = null,
            CancellationToken cancellationToken      = default(CancellationToken))
        {
            if (!string.Equals(Path.GetExtension(path), ".sln", StringComparison.OrdinalIgnoreCase))
            {
                WriteLine($"File is not a solution file: '{path}'.", ConsoleColor.Red, Verbosity.Minimal);
                return(CommandResult.Fail);
            }

            workspace.LoadMetadataForReferencedProjects = true;

            var consoleProgress = new ConsoleProgressReporter(shouldSaveProgress: true);

            var loader = new MSBuildProjectLoader(workspace);

            WriteLine($"Load solution '{path}'", Verbosity.Minimal);

            SolutionInfo solutionInfo = await loader.LoadSolutionInfoAsync(path, consoleProgress, cancellationToken);

            string solutionDirectory = Path.GetDirectoryName(solutionInfo.FilePath);

            Dictionary <string, ImmutableArray <ProjectInfo> > projectInfos = solutionInfo.Projects
                                                                              .GroupBy(f => f.FilePath)
                                                                              .ToDictionary(f => f.Key, f => f.ToImmutableArray());

            Dictionary <string, List <string> > projects = consoleProgress.Projects;

            int nameMaxLength = projects.Max(f => Path.GetFileNameWithoutExtension(f.Key).Length);

            int targetFrameworksMaxLength = projects.Max(f =>
            {
                List <string> frameworks = f.Value;

                return((frameworks != null) ? $"({string.Join(", ", frameworks)})".Length : 0);
            });

            bool anyHasTargetFrameworks = projects.Any(f => f.Value != null);

            WriteLine();
            WriteLine($"{projects.Count} {((projects.Count == 1) ? "project" : "projects")} found in solution '{Path.GetFileNameWithoutExtension(solutionInfo.FilePath)}' [{solutionInfo.FilePath}]", ConsoleColor.Green, Verbosity.Minimal);

            foreach (KeyValuePair <string, List <string> > kvp in projects
                     .OrderBy(f => Path.GetFileName(f.Key)))
            {
                string        projectPath      = kvp.Key;
                List <string> targetFrameworks = kvp.Value;

                ProjectInfo projectInfo = projectInfos[projectPath][0];

                string projectName = Path.GetFileNameWithoutExtension(projectPath);

                Write($"  {projectName.PadRight(nameMaxLength)}  {projectInfo.Language}", Verbosity.Normal);

                if (anyHasTargetFrameworks)
                {
                    Write("  ", Verbosity.Normal);
                }

                if (targetFrameworks != null)
                {
                    string targetFrameworksText = $"({string.Join(", ", targetFrameworks.OrderBy(f => f))})";
                    Write(targetFrameworksText.PadRight(targetFrameworksMaxLength), Verbosity.Normal);
                }
                else
                {
                    Write(new string(' ', targetFrameworksMaxLength), Verbosity.Normal);
                }

                WriteLine($"  [{PathUtilities.TrimStart(projectPath, solutionDirectory)}]", Verbosity.Normal);
            }

            WriteLine();

            return(CommandResult.Success);
        }