Command knows its command resolution strategy
A command may be resolved from a nuget package, from the executing assembly directory, or from the path.
This commit is contained in:
parent
c71709388b
commit
197a02807f
1 changed files with 36 additions and 8 deletions
|
@ -21,9 +21,24 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
private readonly StreamForwarder _stdOut;
|
||||
private readonly StreamForwarder _stdErr;
|
||||
|
||||
public enum CommandResolutionStrategy
|
||||
{
|
||||
//command loaded from a nuget package
|
||||
NugetPackage,
|
||||
|
||||
//command loaded from the same directory as the executing assembly
|
||||
BaseDirectory,
|
||||
|
||||
//command loaded from path
|
||||
Path,
|
||||
|
||||
//command not found
|
||||
None
|
||||
}
|
||||
|
||||
private bool _running = false;
|
||||
|
||||
private Command(string executable, string args)
|
||||
private Command(string executable, string args, CommandResolutionStrategy commandResolution)
|
||||
{
|
||||
// Set the things we need
|
||||
var psi = new ProcessStartInfo()
|
||||
|
@ -41,6 +56,8 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
|
||||
_stdOut = new StreamForwarder();
|
||||
_stdErr = new StreamForwarder();
|
||||
|
||||
CommandResolution = commandResolution;
|
||||
}
|
||||
|
||||
public static Command Create(string executable, IEnumerable<string> args, NuGetFramework framework = null)
|
||||
|
@ -50,20 +67,25 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
|
||||
public static Command Create(string executable, string args, NuGetFramework framework = null)
|
||||
{
|
||||
ResolveExecutablePath(ref executable, ref args, framework);
|
||||
|
||||
return new Command(executable, args);
|
||||
var commandResolution = CommandResolutionStrategy.None;
|
||||
|
||||
ResolveExecutablePath(ref executable, ref args, ref commandResolution, framework);
|
||||
|
||||
return new Command(executable, args, commandResolution);
|
||||
}
|
||||
|
||||
private static void ResolveExecutablePath(ref string executable, ref string args, NuGetFramework framework = null)
|
||||
private static void ResolveExecutablePath(ref string executable, ref string args, ref CommandResolutionStrategy commandResolution, NuGetFramework framework = null)
|
||||
{
|
||||
executable =
|
||||
ResolveExecutablePathFromProject(executable, framework) ??
|
||||
ResolveExecutableFromPath(executable, ref args);
|
||||
ResolveExecutablePathFromProject(executable, framework, ref commandResolution) ??
|
||||
ResolveExecutableFromPath(executable, ref args, ref commandResolution);
|
||||
}
|
||||
|
||||
private static string ResolveExecutableFromPath(string executable, ref string args)
|
||||
private static string ResolveExecutableFromPath(string executable, ref string args, ref CommandResolutionStrategy commandResolution)
|
||||
{
|
||||
commandResolution = CommandResolutionStrategy.Path;
|
||||
|
||||
foreach (string suffix in Constants.RunnableSuffixes)
|
||||
{
|
||||
var fullExecutable = Path.GetFullPath(Path.Combine(
|
||||
|
@ -72,6 +94,8 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
if (File.Exists(fullExecutable))
|
||||
{
|
||||
executable = fullExecutable;
|
||||
|
||||
commandResolution = CommandResolutionStrategy.BaseDirectory;
|
||||
|
||||
// In priority order we've found the best runnable extension, so break.
|
||||
break;
|
||||
|
@ -93,7 +117,7 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
return executable;
|
||||
}
|
||||
|
||||
private static string ResolveExecutablePathFromProject(string executable, NuGetFramework framework)
|
||||
private static string ResolveExecutablePathFromProject(string executable, NuGetFramework framework, ref CommandResolutionStrategy commandResolution)
|
||||
{
|
||||
if (framework == null) return null;
|
||||
|
||||
|
@ -125,6 +149,8 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
var commandPath = commandPackage.Library.Files
|
||||
.First(f => Path.GetFileName(f) == commandName + FileNameSuffixes.DotNet.Exe);
|
||||
|
||||
commandResolution = CommandResolutionStrategy.NugetPackage;
|
||||
|
||||
return Path.Combine(projectContext.PackagesDirectory, commandPackage.Path, commandPath);
|
||||
}
|
||||
|
||||
|
@ -286,6 +312,8 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
return this;
|
||||
}
|
||||
|
||||
public CommandResolutionStrategy CommandResolution { get; }
|
||||
|
||||
private string FormatProcessInfo(ProcessStartInfo info)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(info.Arguments))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue