File: CommandFactory\CommandResolution\PublishedPathCommandResolver.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.DotNet.Cli.Utils;
using Microsoft.DotNet.Cli.Utils.Extensions;
 
namespace Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
 
public class PublishedPathCommandResolver(
    IEnvironmentProvider environment,
    IPublishedPathCommandSpecFactory commandSpecFactory) : ICommandResolver
{
    private const string PublishedPathCommandResolverName = "PublishedPathCommandResolver";
 
    private readonly IEnvironmentProvider _environment = environment;
    private readonly IPublishedPathCommandSpecFactory _commandSpecFactory = commandSpecFactory;
 
    public CommandSpec Resolve(CommandResolverArguments commandResolverArguments)
    {
        var publishDirectory = commandResolverArguments.OutputPath;
        var commandName = commandResolverArguments.CommandName;
        var applicationName = commandResolverArguments.ApplicationName;
 
        if (publishDirectory == null || commandName == null || applicationName == null)
        {
            return null;
        }
 
        var commandPath = ResolveCommandPath(publishDirectory, commandName);
 
        if (commandPath == null)
        {
            return null;
        }
 
        var depsFilePath = Path.Combine(publishDirectory, $"{applicationName}.deps.json");
        if (!File.Exists(depsFilePath))
        {
            Reporter.Verbose.WriteLine(string.Format(
                CliStrings.DoesNotExist,
                PublishedPathCommandResolverName,
                depsFilePath));
            return null;
        }
 
        var runtimeConfigPath = Path.Combine(publishDirectory, $"{applicationName}.runtimeconfig.json");
        if (!File.Exists(runtimeConfigPath))
        {
            Reporter.Verbose.WriteLine(string.Format(
                CliStrings.DoesNotExist,
                PublishedPathCommandResolverName,
                runtimeConfigPath));
            return null;
        }
 
        return _commandSpecFactory.CreateCommandSpecFromPublishFolder(
                commandPath,
                commandResolverArguments.CommandArguments.OrEmptyIfNull(),
                depsFilePath,
                runtimeConfigPath);
    }
 
    private string ResolveCommandPath(string publishDirectory, string commandName)
    {
        if (!Directory.Exists(publishDirectory))
        {
            Reporter.Verbose.WriteLine(string.Format(
                CliStrings.DoesNotExist,
                PublishedPathCommandResolverName,
                publishDirectory));
            return null;
        }
 
        return _environment.GetCommandPathFromRootPath(publishDirectory, commandName, ".dll");
    }
}