6
6
using System . CommandLine ;
7
7
using Microsoft . DotNet . Cli . CommandFactory ;
8
8
using Microsoft . DotNet . Cli . CommandFactory . CommandResolution ;
9
+ using Microsoft . DotNet . Cli . Commands . Tool . Install ;
9
10
using Microsoft . DotNet . Cli . ToolManifest ;
11
+ using Microsoft . DotNet . Cli . ToolPackage ;
10
12
using Microsoft . DotNet . Cli . Utils ;
11
13
using Microsoft . Extensions . EnvironmentAbstractions ;
12
14
@@ -22,7 +24,11 @@ internal class ToolRunCommand(
22
24
private readonly IEnumerable < string > _forwardArgument = result . GetValue ( ToolRunCommandParser . CommandArgument ) ;
23
25
public bool _allowRollForward = result . GetValue ( ToolRunCommandParser . RollForwardOption ) ;
24
26
private readonly ToolManifestFinder _toolManifest = toolManifest ?? new ToolManifestFinder ( new DirectoryPath ( Directory . GetCurrentDirectory ( ) ) ) ;
27
+ private readonly bool _fromSource = result . GetValue ( ToolRunCommandParser . FromSourceOption ) ;
25
28
29
+ private readonly ToolInstallLocalInstaller _toolInstaller = new ( result ) ;
30
+ private readonly IToolManifestEditor _toolManifestEditor = new ToolManifestEditor ( ) ;
31
+ private readonly ILocalToolsResolverCache _localToolsResolverCache = new LocalToolsResolverCache ( ) ;
26
32
public override int Execute ( )
27
33
{
28
34
CommandSpec commandspec = _localToolsCommandResolver . ResolveStrict ( new CommandResolverArguments ( )
@@ -33,6 +39,11 @@ public override int Execute()
33
39
34
40
} , _allowRollForward ) ;
35
41
42
+ if ( commandspec == null && _fromSource )
43
+ {
44
+ commandspec = GetRemoteCommandSpec ( ) ;
45
+ }
46
+
36
47
if ( commandspec == null )
37
48
{
38
49
throw new GracefulException ( [ string . Format ( CliCommandStrings . CannotFindCommandName , _toolCommandName ) ] , isUserError : false ) ;
@@ -41,4 +52,29 @@ public override int Execute()
41
52
var result = CommandFactoryUsingResolver . Create ( commandspec ) . Execute ( ) ;
42
53
return result . ExitCode ;
43
54
}
55
+
56
+ public CommandSpec GetRemoteCommandSpec ( )
57
+ {
58
+ FilePath manifestFile = _toolManifest . FindFirst ( true ) ;
59
+ PackageId packageId = new ( _toolCommandName ) ;
60
+
61
+ IToolPackage toolPackage = _toolInstaller . Install ( manifestFile , packageId ) ;
62
+
63
+ _toolManifestEditor . Add (
64
+ manifestFile ,
65
+ toolPackage . Id ,
66
+ toolPackage . Version ,
67
+ [ toolPackage . Command . Name ] ,
68
+ _allowRollForward ) ;
69
+
70
+ _localToolsResolverCache . SaveToolPackage (
71
+ toolPackage ,
72
+ _toolInstaller . TargetFrameworkToInstall ) ;
73
+
74
+ return _localToolsCommandResolver . ResolveStrict ( new CommandResolverArguments ( )
75
+ {
76
+ CommandName = $ "dotnet-{ toolPackage . Command . Name } ",
77
+ CommandArguments = _forwardArgument ,
78
+ } , _allowRollForward ) ;
79
+ }
44
80
}
0 commit comments