| File: CommandFactory\CommandResolution\ProjectFactory.cs | Web Access |
| Project: src\sdk\src\Cli\dotnet\dotnet.csproj (dotnet) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #nullable disable using Microsoft.Build.Exceptions; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Cli.Utils.Extensions; using NuGet.Frameworks; namespace Microsoft.DotNet.Cli.CommandFactory.CommandResolution; internal class ProjectFactory(IEnvironmentProvider environment) { private const string ProjectFactoryName = "projectfactory"; private readonly IEnvironmentProvider _environment = environment; public IProject GetProject( string projectDirectory, NuGetFramework framework, string configuration, string buildBasePath, string outputPath) { return GetMSBuildProj(projectDirectory, framework, configuration, outputPath); } private IProject GetMSBuildProj(string projectDirectory, NuGetFramework framework, string configuration, string outputPath) { var msBuildExePath = _environment.GetEnvironmentVariable(Constants.MSBUILD_EXE_PATH); msBuildExePath = string.IsNullOrEmpty(msBuildExePath) ? Path.Combine(AppContext.BaseDirectory, "MSBuild.dll") : msBuildExePath; Reporter.Verbose.WriteLine(string.Format( CliStrings.MSBuildExePath, ProjectFactoryName, msBuildExePath)); string msBuildProjectPath = GetMSBuildProjPath(projectDirectory); Reporter.Verbose.WriteLine(string.Format( CliStrings.MSBuildProjectPath, ProjectFactoryName, msBuildProjectPath)); if (msBuildProjectPath == null) { return null; } try { return new MSBuildProject(msBuildProjectPath, framework, configuration, outputPath, msBuildExePath); } catch (InvalidProjectFileException ex) { Reporter.Verbose.WriteLine(ex.ToString().Red()); return null; } } private static string GetMSBuildProjPath(string projectDirectory) { IEnumerable<string> projectFiles = Directory .GetFiles(projectDirectory, "*.*proj") .Where(d => !d.EndsWith(".xproj")); if (projectFiles.Count() == 0) { return null; } else if (projectFiles.Count() > 1) { throw new GracefulException(string.Format( CliStrings.MultipleProjectFilesFound, projectDirectory)); } return projectFiles.First(); } }