File: CommandFactory\CommandResolution\ProjectFactory.cs
Web Access
Project: ..\..\..\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();
    }
}