5
5
using Microsoft . DotNet . Cli . CommandFactory ;
6
6
using Microsoft . DotNet . Cli . CommandFactory . CommandResolution ;
7
7
using Microsoft . DotNet . Cli . Commands . Tool . Install ;
8
+ using Microsoft . DotNet . Cli . Commands . Tool . Restore ;
9
+ using Microsoft . DotNet . Cli . Commands . Tool . Run ;
10
+ using Microsoft . DotNet . Cli . Extensions ;
11
+ using Microsoft . DotNet . Cli . NuGetPackageDownloader ;
12
+ using Microsoft . DotNet . Cli . ToolManifest ;
8
13
using Microsoft . DotNet . Cli . ToolPackage ;
9
14
using Microsoft . DotNet . Cli . Utils ;
15
+ using Microsoft . DotNet . Cli . Utils . Extensions ;
16
+
17
+ using Microsoft . Extensions . EnvironmentAbstractions ;
10
18
using NuGet . Common ;
11
19
using NuGet . Packaging . Core ;
12
20
using NuGet . Versioning ;
13
21
22
+
14
23
namespace Microsoft . DotNet . Cli . Commands . Tool . Execute
15
24
{
16
- internal class ToolExecuteCommand ( ParseResult result ) : CommandBase ( result )
25
+ internal class ToolExecuteCommand ( ParseResult result , ToolManifestFinder ? toolManifestFinder = null , string ? currentWorkingDirectory = null ) : CommandBase ( result )
17
26
{
18
27
private readonly PackageIdentity _packageToolIdentityArgument = result . GetRequiredValue ( ToolExecuteCommandParser . PackageIdentityArgument ) ;
19
28
private readonly IEnumerable < string > _forwardArguments = result . GetValue ( ToolExecuteCommandParser . CommandArgument ) ?? Enumerable . Empty < string > ( ) ;
@@ -25,10 +34,60 @@ internal class ToolExecuteCommand(ParseResult result) : CommandBase(result)
25
34
private readonly bool _interactive = result . GetValue ( ToolExecuteCommandParser . InteractiveOption ) ;
26
35
private readonly VerbosityOptions _verbosity = result . GetValue ( ToolExecuteCommandParser . VerbosityOption ) ;
27
36
private readonly bool _yes = result . GetValue ( ToolExecuteCommandParser . YesOption ) ;
37
+
38
+ // TODO: Does result.OptionValuesToBeForwarded work here?
39
+ private readonly IToolPackageDownloader _toolPackageDownloader = ToolPackageFactory . CreateToolPackageStoresAndDownloader (
40
+ additionalRestoreArguments : result . OptionValuesToBeForwarded ( ToolExecuteCommandParser . GetCommand ( ) ) ) . Item3 ;
41
+
42
+ // TODO: Make sure to add these options to the command
43
+ private readonly RestoreActionConfig _restoreActionConfig = new RestoreActionConfig ( DisableParallel : result . GetValue ( ToolCommandRestorePassThroughOptions . DisableParallelOption ) ,
44
+ NoCache : result . GetValue ( ToolCommandRestorePassThroughOptions . NoCacheOption ) || result . GetValue ( ToolCommandRestorePassThroughOptions . NoHttpCacheOption ) ,
45
+ IgnoreFailedSources : result . GetValue ( ToolCommandRestorePassThroughOptions . IgnoreFailedSourcesOption ) ,
46
+ Interactive : result . GetValue ( ToolCommandRestorePassThroughOptions . InteractiveRestoreOption ) ) ;
47
+
48
+ // TODO: Use prerelease
28
49
private readonly bool _prerelease = result . GetValue ( ToolExecuteCommandParser . PrereleaseOption ) ;
29
50
51
+ private readonly ToolManifestFinder _toolManifestFinder = toolManifestFinder ?? new ToolManifestFinder ( new DirectoryPath ( currentWorkingDirectory ?? Directory . GetCurrentDirectory ( ) ) ) ;
52
+
30
53
public override int Execute ( )
31
54
{
55
+ VersionRange versionRange = _parseResult . GetVersionRange ( ) ;
56
+ PackageId packageId = new PackageId ( _packageToolIdentityArgument . Id ) ;
57
+
58
+ // Look in local tools manifest first, but only if version is not specified
59
+ if ( versionRange == null )
60
+ {
61
+ var localToolsResolverCache = new LocalToolsResolverCache ( ) ;
62
+
63
+ if ( _toolManifestFinder . TryFindPackageId ( packageId , out var toolManifestPackage ) )
64
+ {
65
+ var toolPackageRestorer = new ToolPackageRestorer (
66
+ _toolPackageDownloader ,
67
+ _sources ,
68
+ overrideSources : [ ] ,
69
+ _verbosity ,
70
+ _restoreActionConfig ,
71
+ localToolsResolverCache ,
72
+ new FileSystemWrapper ( ) ) ;
73
+
74
+ var restoreResult = toolPackageRestorer . InstallPackage ( toolManifestPackage , _configFile == null ? null : new FilePath ( _configFile ) ) ;
75
+
76
+ if ( ! restoreResult . IsSuccess )
77
+ {
78
+ Reporter . Error . WriteLine ( restoreResult . Message . Red ( ) ) ;
79
+ return 1 ;
80
+ }
81
+
82
+ var localToolsCommandResolver = new LocalToolsCommandResolver (
83
+ _toolManifestFinder ,
84
+ localToolsResolverCache ) ;
85
+
86
+ return ToolRunCommand . ExecuteCommand ( localToolsCommandResolver , toolManifestPackage . CommandNames . Single ( ) . Value , _forwardArguments , _allowRollForward ) ;
87
+ }
88
+ }
89
+
90
+
32
91
if ( ! UserAgreedToRunFromSource ( ) )
33
92
{
34
93
throw new GracefulException ( CliCommandStrings . ToolRunFromSourceUserConfirmationFailed , isUserError : true ) ;
@@ -39,16 +98,10 @@ public override int Execute()
39
98
_forwardArguments . Append ( "--allow-roll-forward" ) ;
40
99
}
41
100
42
- PackageId packageId = new PackageId ( _packageToolIdentityArgument . Id ) ;
43
-
44
- VersionRange versionRange = _parseResult . GetVersionRange ( ) ;
45
101
46
102
string tempDirectory = NuGetEnvironment . GetFolderPath ( NuGetFolderPath . Temp ) ;
47
103
48
- ToolPackageStoreAndQuery toolPackageStoreAndQuery = new ( new ( tempDirectory ) ) ;
49
- ToolPackageDownloader toolPackageDownloader = new ( toolPackageStoreAndQuery ) ;
50
-
51
- IToolPackage toolPackage = toolPackageDownloader . InstallPackage (
104
+ IToolPackage toolPackage = _toolPackageDownloader . InstallPackage (
52
105
new PackageLocation (
53
106
nugetConfig : _configFile != null ? new ( _configFile ) : null ,
54
107
sourceFeedOverrides : _sources ,
0 commit comments