private (Project, ProjectInstance) GetProjectObjects(string projectFilePath)
        {
            var buildLogger = new SimpleMsBuildLogger();

            Project project;

            try
            {
                project = new Project(
                    projectFilePath,
                    globalProperties: null,
                    toolsVersion: null,
                    new ProjectCollection(
                        null,
                        new Microsoft.Build.Framework.ILogger[] { buildLogger },
                        ToolsetDefinitionLocations.Default));
            }
            catch (Exception ex)
            {
                this._logger.Log($"Error attempting to load project '{projectFilePath}'.");
                this._logger.Log(ex.Message);

                if (_verboseOutput)
                {
                    this._logger.LogVerbose(buildLogger.LogText);
                }

                throw;
            }

            ProjectInstance projectInstance = _designTimeBuilder.Execute(project);

            return(project, projectInstance);
        }
Example #2
0
        public ProjectInstance Execute(Project project)
        {
            _logger.LogVerbose($"Beginning design-time build of project {project.FullPath}.");

            _logger.LogVerbose("Setting the following global properties:");
            foreach (KeyValuePair <string, string> kvp in _globalProperties)
            {
                project.SetGlobalProperty(kvp.Key, kvp.Value);
                _logger.LogVerbose($"    {kvp.Key}={kvp.Value}");
            }

            ProjectInstance projectInstance = project.CreateProjectInstance();

            var designTimeBuildTargets = new string[] {
                "CollectResolvedSDKReferencesDesignTime",
                "CollectPackageReferences",
                "ResolveComReferencesDesignTime",
                "ResolveProjectReferencesDesignTime",
                "BuiltProjectOutputGroup",
                "ResolveAssemblyReferencesDesignTime",
                "CollectSDKReferencesDesignTime",
                "ResolvePackageDependenciesDesignTime",
                "CompileDesignTime",
                "CollectFrameworkReferences",
                "CollectUpToDateCheckBuiltDesignTime",
                "CollectPackageDownloads",
                "CollectAnalyzersDesignTime",
                "CollectUpToDateCheckInputDesignTime",
                "CollectUpToDateCheckOutputDesignTime",
                "CollectResolvedCompilationReferencesDesignTime"
            };

            SimpleMsBuildLogger buildLogger;
            bool result  = false;
            int  retries = 0;

            // Retrying here as there are some odd cases where a file will be in use by another process
            // long enough for this to fail, but will work on a subsequent attempt.
            do
            {
                buildLogger = new SimpleMsBuildLogger();

                _logger.LogVerbose($"Attempting design-time build # {retries + 1}...");
                result = projectInstance.Build(designTimeBuildTargets, new Microsoft.Build.Framework.ILogger[] { buildLogger });
            }while (!result && (++retries < _numRetries));

            if (!result || _alwaysLogBuildLog)
            {
                _logger.LogVerbose("Design time build log:");
                _logger.LogVerbose(buildLogger.LogText);
                _logger.LogVerbose(string.Empty);
            }

            if (!result)
            {
                throw new Exception("Failed to build project.\r\n" + buildLogger.ErrorText);
            }

            return(projectInstance);
        }