diff --git a/.editorconfig b/.editorconfig
index bc17bbe69267..ec6569278190 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -280,6 +280,10 @@ dotnet_diagnostic.IDE0200.severity = none
dotnet_diagnostic.IDE0240.severity = warning
# Additional rules for template engine source code
+
+# Default severity for analyzer diagnostics with category 'StyleCop.CSharp.SpacingRules'
+dotnet_analyzer_diagnostic.category-StyleCop.CSharp.SpacingRules.severity = none
+
[{src,test}/**{Microsoft.TemplateEngine.*,dotnet-new?*}/**.cs]
# Default analyzed API surface = 'public' (public APIs)
dotnet_code_quality.api_surface = public
diff --git a/src/Cli/Microsoft.DotNet.Cli.Utils/Activities.cs b/src/Cli/Microsoft.DotNet.Cli.Utils/Activities.cs
index 9f4665572436..d477b8b342f1 100644
--- a/src/Cli/Microsoft.DotNet.Cli.Utils/Activities.cs
+++ b/src/Cli/Microsoft.DotNet.Cli.Utils/Activities.cs
@@ -6,15 +6,27 @@
namespace Microsoft.DotNet.Cli.Utils;
///
-/// Contains helpers for working with Activities in the .NET CLI.
+/// Contains helpers for working with Activities in the .NET CLI.
///
public static class Activities
{
-
///
/// The main entrypoint for creating Activities in the .NET CLI.
/// All activities created in the CLI should use this , to allow
/// consumers to easily filter and trace CLI activities.
///
public static ActivitySource Source { get; } = new("dotnet-cli", Product.Version);
+
+ ///
+ /// The environment variable used to transfer the chain of parent activity IDs.
+ /// This should be used when constructing new sub-processes in order to
+ /// track spans across calls.
+ ///
+ public const string TRACEPARENT = nameof(TRACEPARENT);
+ ///
+ /// The environment variable used to transfer the trace state of the parent activities.
+ /// This should be used when constructing new sub-processes in order to
+ /// track spans across calls.
+ ///
+ public const string TRACESTATE = nameof(TRACESTATE);
}
diff --git a/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/InstantiateCommand.cs b/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/InstantiateCommand.cs
index 7889716ea67b..485aa9493408 100644
--- a/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/InstantiateCommand.cs
+++ b/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/InstantiateCommand.cs
@@ -51,13 +51,13 @@ internal InstantiateCommand(
Arity = new ArgumentArity(0, 999)
};
- internal IReadOnlyList PassByOptions { get; } = new Option[]
- {
+ internal IReadOnlyList PassByOptions { get; } =
+ [
SharedOptions.ForceOption,
SharedOptions.NameOption,
SharedOptions.DryRunOption,
SharedOptions.NoUpdateCheckOption
- };
+ ];
internal static Task ExecuteAsync(
NewCommandArgs newCommandArgs,
@@ -74,6 +74,7 @@ internal static async Task> GetTemplateGroupsAsync(
HostSpecificDataLoader hostSpecificDataLoader,
CancellationToken cancellationToken)
{
+ using var createTemplateGroupsActivity = Activities.Source.StartActivity("create-template-groups");
IReadOnlyList templates = await templatePackageManager.GetTemplatesAsync(cancellationToken).ConfigureAwait(false);
return TemplateGroup.FromTemplateList(CliTemplateInfo.FromTemplateInfo(templates, hostSpecificDataLoader));
}
@@ -84,6 +85,7 @@ internal static HashSet GetTemplateCommand(
TemplatePackageManager templatePackageManager,
TemplateGroup templateGroup)
{
+ using var getTemplateActivity = Activities.Source.StartActivity("get-template-command");
//groups templates in the group by precedence
foreach (IGrouping templateGrouping in templateGroup.Templates.GroupBy(g => g.Precedence).OrderByDescending(g => g.Key))
{
@@ -114,7 +116,7 @@ internal static HashSet GetTemplateCommand(
templateGroup,
candidates);
}
- return new HashSet();
+ return [];
}
internal static void HandleNoMatchingTemplateGroup(InstantiateCommandArgs instantiateArgs, IEnumerable templateGroups, IReporter reporter)
@@ -204,6 +206,8 @@ private static async Task ExecuteIntAsync(
return await templateListCoordinator.DisplayCommandDescriptionAsync(instantiateArgs, cancellationToken).ConfigureAwait(false);
}
+ using var createActivity = Activities.Source.StartActivity("instantiate-command");
+ createActivity?.DisplayName = $"Invoke '{instantiateArgs.ShortName}'";
IEnumerable allTemplateGroups = await GetTemplateGroupsAsync(
templatePackageManager,
@@ -273,10 +277,11 @@ private static async Task HandleTemplateInstantiationAsync(
{
TemplateCommand templateCommandToRun = candidates.Single();
args.Command.Subcommands.Add(templateCommandToRun);
-
+ var templateParseActivity = Activities.Source.StartActivity("reparse-for-template");
ParseResult updatedParseResult = args.ParseResult.RootCommandResult.Command.Parse(
args.ParseResult.Tokens.Select(t => t.Value).ToArray(),
args.ParseResult.Configuration);
+ templateParseActivity?.Stop();
return await candidates.Single().InvokeAsync(updatedParseResult, cancellationToken).ConfigureAwait(false);
}
else if (candidates.Any())
diff --git a/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/TemplateCommand.cs b/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/TemplateCommand.cs
index f078574630c2..50ba229fd8a4 100644
--- a/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/TemplateCommand.cs
+++ b/src/Cli/Microsoft.TemplateEngine.Cli/Commands/create/TemplateCommand.cs
@@ -17,7 +17,7 @@ namespace Microsoft.TemplateEngine.Cli.Commands
internal class TemplateCommand : Command
{
private static readonly TimeSpan ConstraintEvaluationTimeout = TimeSpan.FromMilliseconds(1000);
- private static readonly string[] _helpAliases = new[] { "-h", "/h", "--help", "-?", "/?" };
+ private static readonly string[] _helpAliases = ["-h", "/h", "--help", "-?", "/?"];
private readonly TemplatePackageManager _templatePackageManager;
private readonly IEngineEnvironmentSettings _environmentSettings;
private readonly BaseCommand _instantiateCommand;
@@ -146,19 +146,23 @@ internal static async Task> ValidateCons
internal async Task InvokeAsync(ParseResult parseResult, CancellationToken cancellationToken)
{
+ using var templateInvocationActivity = Activities.Source.StartActivity("invoke-template");
TemplateCommandArgs args = new(this, _instantiateCommand, parseResult);
TemplateInvoker invoker = new(_environmentSettings, () => Console.ReadLine() ?? string.Empty);
TemplatePackageCoordinator packageCoordinator = new(_environmentSettings, _templatePackageManager);
- TemplateConstraintManager constraintManager = new(_environmentSettings);
+ using TemplateConstraintManager constraintManager = new(_environmentSettings);
TemplatePackageDisplay templatePackageDisplay = new(Reporter.Output, Reporter.Error);
CancellationTokenSource cancellationTokenSource = new();
cancellationTokenSource.CancelAfter(ConstraintEvaluationTimeout);
+#pragma warning disable CA2025 // Do not pass 'IDisposable' instances into unawaited tasks
Task> constraintsEvaluation = ValidateConstraintsAsync(constraintManager, args.Template, args.IsForceFlagSpecified ? cancellationTokenSource.Token : cancellationToken);
+#pragma warning restore CA2025 // Do not pass 'IDisposable' instances into unawaited tasks
if (!args.IsForceFlagSpecified)
{
+ using var constraintResultsActivity = Activities.Source.StartActivity("validate-constraints");
var constraintResults = await constraintsEvaluation.ConfigureAwait(false);
if (constraintResults.Any())
{
@@ -173,7 +177,7 @@ internal async Task InvokeAsync(ParseResult parseResult, Cance
Task<(string Id, string Version, string Provider)> builtInPackageCheck = packageCoordinator.ValidateBuiltInPackageAvailabilityAsync(args.Template, cancellationToken);
Task checkForUpdateTask = packageCoordinator.CheckUpdateForTemplate(args, cancellationToken);
- Task[] tasksToWait = new Task[] { instantiateTask, builtInPackageCheck, checkForUpdateTask };
+ Task[] tasksToWait = [instantiateTask, builtInPackageCheck, checkForUpdateTask];
await Task.WhenAll(tasksToWait).ConfigureAwait(false);
Reporter.Output.WriteLine();
diff --git a/src/Cli/Microsoft.TemplateEngine.Cli/TemplateInvoker.cs b/src/Cli/Microsoft.TemplateEngine.Cli/TemplateInvoker.cs
index 581ba2892234..52179d3c1550 100644
--- a/src/Cli/Microsoft.TemplateEngine.Cli/TemplateInvoker.cs
+++ b/src/Cli/Microsoft.TemplateEngine.Cli/TemplateInvoker.cs
@@ -37,6 +37,7 @@ internal TemplateInvoker(
internal async Task InvokeTemplateAsync(TemplateCommandArgs templateArgs, CancellationToken cancellationToken)
{
+ using var invokerActivity = Activities.Source.StartActivity("invoker-invoking");
cancellationToken.ThrowIfCancellationRequested();
CliTemplateInfo templateToRun = templateArgs.Template;
@@ -158,6 +159,7 @@ private async Task CreateTemplateAsync(TemplateCommandArgs tem
try
{
+ using var templateCreationActivity = Activities.Source.StartActivity("actual-instantiate-template");
instantiateResult = await _templateCreator.InstantiateAsync(
templateArgs.Template,
templateArgs.Name,
@@ -306,6 +308,7 @@ private async Task CreateTemplateAsync(TemplateCommandArgs tem
private NewCommandStatus HandlePostActions(ITemplateCreationResult creationResult, TemplateCommandArgs args)
{
+ using var postActionActivity = Activities.Source.StartActivity("post-actions");
PostActionExecutionStatus result = _postActionDispatcher.Process(creationResult, args.IsDryRun, args.AllowScripts ?? AllowRunScripts.Prompt);
return result switch
diff --git a/src/Cli/Microsoft.TemplateEngine.Cli/TemplateListCoordinator.cs b/src/Cli/Microsoft.TemplateEngine.Cli/TemplateListCoordinator.cs
index 4f725fb268ff..0a78b36dd923 100644
--- a/src/Cli/Microsoft.TemplateEngine.Cli/TemplateListCoordinator.cs
+++ b/src/Cli/Microsoft.TemplateEngine.Cli/TemplateListCoordinator.cs
@@ -24,12 +24,12 @@ internal TemplateListCoordinator(
IEngineEnvironmentSettings engineEnvironmentSettings,
TemplatePackageManager templatePackageManager,
IHostSpecificDataLoader hostSpecificDataLoader)
-
{
_engineEnvironmentSettings = engineEnvironmentSettings ?? throw new ArgumentNullException(nameof(engineEnvironmentSettings));
_templatePackageManager = templatePackageManager ?? throw new ArgumentNullException(nameof(templatePackageManager));
_hostSpecificDataLoader = hostSpecificDataLoader ?? throw new ArgumentNullException(nameof(hostSpecificDataLoader));
_defaultLanguage = engineEnvironmentSettings.GetDefaultLanguage();
+ using var constraintManagerActivity = Activities.Source.StartActivity("create-constraints");
_constraintManager = new TemplateConstraintManager(_engineEnvironmentSettings);
}
@@ -48,7 +48,6 @@ internal async Task DisplayTemplateGroupListAsync(
ListTemplateResolver resolver = new(_constraintManager, _templatePackageManager, _hostSpecificDataLoader);
TemplateResolutionResult resolutionResult = await resolver.ResolveTemplatesAsync(args, _defaultLanguage, cancellationToken).ConfigureAwait(false);
- //IReadOnlyDictionary? appliedParameterMatches = resolutionResult.GetAllMatchedParametersList();
if (resolutionResult.TemplateGroupsWithMatchingTemplateInfoAndParameters.Any())
{
Reporter.Output.WriteLine(LocalizableStrings.TemplatesFoundMatchingInputParameters, GetInputParametersString(args));
@@ -66,10 +65,10 @@ internal async Task DisplayTemplateGroupListAsync(
}
else
{
- //if there is no criteria and filters it means that dotnet new list was run but there is no templates installed.
+ // If there is no criteria and filters, it means that dotnet new list was run but there are no templates installed.
if (args.ListNameCriteria == null && !args.AppliedFilters.Any())
{
- //No templates installed.
+ // No templates installed.
Reporter.Output.WriteLine(LocalizableStrings.NoTemplatesFound);
Reporter.Output.WriteLine();
// To search for the templates on NuGet.org, run:
@@ -83,7 +82,7 @@ internal async Task DisplayTemplateGroupListAsync(
return NewCommandStatus.Success;
}
- // at least one criteria was specified.
+ // At least one criteria was specified.
// No templates found matching the following input parameter(s): {0}.
Reporter.Error.WriteLine(
string.Format(
@@ -195,33 +194,30 @@ internal async Task DisplayCommandDescriptionAsync(
return NewCommandStatus.Success;
}
- private static string GetInputParametersString(ListCommandArgs args/*, IReadOnlyDictionary? templateParameters = null*/)
+ private static string GetInputParametersString(ListCommandArgs args)
{
string separator = ", ";
IEnumerable appliedFilters = args.AppliedFilters
.Select(filter => $"{args.GetFilterToken(filter)}='{args.GetFilterValue(filter)}'");
- //IEnumerable appliedTemplateParameters = templateParameters?
- // .Select(param => string.IsNullOrWhiteSpace(param.Value) ? param.Key : $"{param.Key}='{param.Value}'") ?? Array.Empty();
-
StringBuilder inputParameters = new();
string? mainCriteria = args.ListNameCriteria;
if (!string.IsNullOrWhiteSpace(mainCriteria))
{
inputParameters.Append($"'{mainCriteria}'");
- if (appliedFilters.Any()/* || appliedTemplateParameters.Any()*/)
+ if (appliedFilters.Any())
{
inputParameters.Append(separator);
}
}
- if (appliedFilters/*.Concat(appliedTemplateParameters)*/.Any())
+ if (appliedFilters.Any())
{
- inputParameters.Append(string.Join(separator, appliedFilters/*.Concat(appliedTemplateParameters)*/));
+ inputParameters.Append(string.Join(separator, appliedFilters));
}
return inputParameters.ToString();
}
- private static string GetPartialMatchReason(TemplateResolutionResult templateResolutionResult, ListCommandArgs args/*, IReadOnlyDictionary? templateParameters = null*/)
+ private static string GetPartialMatchReason(TemplateResolutionResult templateResolutionResult, ListCommandArgs args)
{
string separator = ", ";
@@ -230,15 +226,10 @@ private static string GetPartialMatchReason(TemplateResolutionResult templateRes
.Where(filter => filter.MismatchCriteria(templateResolutionResult))
.Select(filter => $"{args.GetFilterToken(filter)}='{args.GetFilterValue(filter)}'");
- //IEnumerable appliedTemplateParameters = templateParameters?
- // .Where(parameter =>
- // templateResolutionResult.IsParameterMismatchReason(parameter.Key))
- // .Select(param => string.IsNullOrWhiteSpace(param.Value) ? param.Key : $"{param.Key}='{param.Value}'") ?? Array.Empty();
-
StringBuilder inputParameters = new();
- if (appliedFilters/*.Concat(appliedTemplateParameters)*/.Any())
+ if (appliedFilters.Any())
{
- inputParameters.Append(string.Join(separator, appliedFilters/*.Concat(appliedTemplateParameters)*/));
+ inputParameters.Append(string.Join(separator, appliedFilters));
}
return inputParameters.ToString();
}
diff --git a/src/Cli/dotnet/Commands/CliCommandStrings.resx b/src/Cli/dotnet/Commands/CliCommandStrings.resx
index 2a62ba8ec28d..9a2d1b854981 100644
--- a/src/Cli/dotnet/Commands/CliCommandStrings.resx
+++ b/src/Cli/dotnet/Commands/CliCommandStrings.resx
@@ -2605,4 +2605,7 @@ Proceed?
Tool package download needs confirmation. Run in interactive mode or use the "--yes" command-line option to confirm.
{Locked="--yes"}
-
+
+ A package ID was not specified for tool installation.
+
+
\ No newline at end of file
diff --git a/src/Cli/dotnet/Commands/Tool/Execute/ToolExecuteCommand.cs b/src/Cli/dotnet/Commands/Tool/Execute/ToolExecuteCommand.cs
index bdfdacb42d58..5beec8c87c99 100644
--- a/src/Cli/dotnet/Commands/Tool/Execute/ToolExecuteCommand.cs
+++ b/src/Cli/dotnet/Commands/Tool/Execute/ToolExecuteCommand.cs
@@ -41,9 +41,13 @@ internal class ToolExecuteCommand(ParseResult result, ToolManifestFinder? toolMa
public override int Execute()
{
- VersionRange versionRange = _parseResult.GetVersionRange();
+ VersionRange? versionRange = _parseResult.GetVersionRange();
PackageId packageId = new PackageId(_packageToolIdentityArgument.Id);
+ var toolLocationActivity = Activities.Source.StartActivity("find-tool");
+ toolLocationActivity?.SetTag("packageId", packageId.ToString());
+ toolLocationActivity?.SetTag("versionRange", versionRange?.ToString() ?? "latest");
+
// Look in local tools manifest first, but only if version is not specified
if (versionRange == null)
{
@@ -51,6 +55,9 @@ public override int Execute()
if (_toolManifestFinder.TryFindPackageId(packageId, out var toolManifestPackage))
{
+ toolLocationActivity?.SetTag("kind", "local");
+ toolLocationActivity?.Stop();
+
var toolPackageRestorer = new ToolPackageRestorer(
_toolPackageDownloader,
_sources,
@@ -82,6 +89,8 @@ public override int Execute()
additionalFeeds: _addSource);
(var bestVersion, var packageSource) = _toolPackageDownloader.GetNuGetVersion(packageLocation, packageId, _verbosity, versionRange, _restoreActionConfig);
+ toolLocationActivity?.SetTag("kind", "one-shot");
+ toolLocationActivity?.Stop();
// TargetFramework is null, which means to use the current framework. Global tools can override the target framework to use (or select assets for),
// but we don't support this for local or one-shot tools.
@@ -119,6 +128,10 @@ public override int Execute()
restoreActionConfig: _restoreActionConfig);
}
+ using var toolExecuteActivity = Activities.Source.StartActivity("execute-tool");
+ toolExecuteActivity?.SetTag("packageId", packageId.ToString());
+ toolExecuteActivity?.SetTag("version", toolPackage.Version.ToString());
+ toolExecuteActivity?.SetTag("source", toolPackage.Command.Runner);
var commandSpec = ToolCommandSpecCreator.CreateToolCommandSpec(toolPackage.Command.Name.Value, toolPackage.Command.Executable.Value, toolPackage.Command.Runner, _allowRollForward, _forwardArguments);
var command = CommandFactoryUsingResolver.Create(commandSpec);
var result = command.Execute();
diff --git a/src/Cli/dotnet/Commands/Tool/Install/ParseResultExtension.cs b/src/Cli/dotnet/Commands/Tool/Install/ParseResultExtension.cs
index fcb8364f76e8..04f72303008d 100644
--- a/src/Cli/dotnet/Commands/Tool/Install/ParseResultExtension.cs
+++ b/src/Cli/dotnet/Commands/Tool/Install/ParseResultExtension.cs
@@ -1,8 +1,6 @@
// 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 System.CommandLine;
using Microsoft.DotNet.Cli.Utils;
using NuGet.Versioning;
@@ -11,7 +9,7 @@ namespace Microsoft.DotNet.Cli.Commands.Tool.Install;
internal static class ParseResultExtension
{
- public static VersionRange GetVersionRange(this ParseResult parseResult)
+ public static VersionRange? GetVersionRange(this ParseResult parseResult)
{
var packageVersionFromIdentityArgument = parseResult.GetValue(ToolInstallCommandParser.PackageIdentityArgument).VersionRange?.OriginalString;
var packageVersionFromVersionOption = parseResult.GetValue(ToolInstallCommandParser.VersionOption);
@@ -22,7 +20,7 @@ public static VersionRange GetVersionRange(this ParseResult parseResult)
throw new GracefulException(CliStrings.PackageIdentityArgumentVersionOptionConflict);
}
- string packageVersion = packageVersionFromIdentityArgument ?? packageVersionFromVersionOption;
+ string? packageVersion = packageVersionFromIdentityArgument ?? packageVersionFromVersionOption;
bool prerelease = parseResult.GetValue(ToolInstallCommandParser.PrereleaseOption);
@@ -39,10 +37,10 @@ public static VersionRange GetVersionRange(this ParseResult parseResult)
packageVersion = "*-*";
}
- VersionRange versionRange = null;
+ VersionRange? versionRange = null;
// accept 'bare' versions and interpret 'bare' versions as NuGet exact versions
- if (!string.IsNullOrEmpty(packageVersion) && NuGetVersion.TryParse(packageVersion, out NuGetVersion version2))
+ if (!string.IsNullOrEmpty(packageVersion) && NuGetVersion.TryParse(packageVersion, out NuGetVersion? version2))
{
return new VersionRange(minVersion: version2, includeMinVersion: true, maxVersion: version2, includeMaxVersion: true, originalString: "[" + packageVersion + "]");
}
diff --git a/src/Cli/dotnet/Commands/Tool/Install/ToolInstallGlobalOrToolPathCommand.cs b/src/Cli/dotnet/Commands/Tool/Install/ToolInstallGlobalOrToolPathCommand.cs
index 0a23fad43910..e54c5671e232 100644
--- a/src/Cli/dotnet/Commands/Tool/Install/ToolInstallGlobalOrToolPathCommand.cs
+++ b/src/Cli/dotnet/Commands/Tool/Install/ToolInstallGlobalOrToolPathCommand.cs
@@ -1,10 +1,7 @@
// 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 System.CommandLine;
-using System.Transactions;
using Microsoft.DotNet.Cli.NuGetPackageDownloader;
using Microsoft.DotNet.Cli.ToolPackage;
using Microsoft.DotNet.Cli.Utils;
@@ -16,7 +13,6 @@
using Microsoft.DotNet.Cli.Extensions;
using Microsoft.DotNet.Cli.ShellShim;
using Microsoft.DotNet.Cli.Commands.Tool.Update;
-using Microsoft.DotNet.Cli.Commands.Tool.Common;
using Microsoft.DotNet.Cli.Commands.Tool.Uninstall;
using Microsoft.DotNet.Cli.Commands.Tool.List;
@@ -26,7 +22,7 @@ namespace Microsoft.DotNet.Cli.Commands.Tool.Install;
internal delegate (IToolPackageStore, IToolPackageStoreQuery, IToolPackageDownloader) CreateToolPackageStoresAndDownloader(
DirectoryPath? nonGlobalLocation = null,
- IEnumerable forwardRestoreArguments = null);
+ IEnumerable? forwardRestoreArguments = null);
internal class ToolInstallGlobalOrToolPathCommand : CommandBase
{
@@ -35,36 +31,36 @@ internal class ToolInstallGlobalOrToolPathCommand : CommandBase
private readonly CreateShellShimRepository _createShellShimRepository;
private readonly CreateToolPackageStoresAndDownloaderAndUninstaller _createToolPackageStoreDownloaderUninstaller;
private readonly ShellShimTemplateFinder _shellShimTemplateFinder;
- private readonly IToolPackageStoreQuery _store;
+ private readonly IToolPackageStoreQuery? _store;
private readonly PackageId? _packageId;
- private readonly string _configFilePath;
- private readonly string _framework;
- private readonly string[] _source;
- private readonly string[] _addSource;
+ private readonly string? _configFilePath;
+ private readonly string? _framework;
+ private readonly string[]? _source;
+ private readonly string[]? _addSource;
private readonly bool _global;
private readonly VerbosityOptions _verbosity;
- private readonly string _toolPath;
- private readonly string _architectureOption;
+ private readonly string? _toolPath;
+ private readonly string? _architectureOption;
private readonly IEnumerable _forwardRestoreArguments;
private readonly bool _allowRollForward;
private readonly bool _allowPackageDowngrade;
private readonly bool _updateAll;
- private readonly string _currentWorkingDirectory;
+ private readonly string? _currentWorkingDirectory;
private readonly bool? _verifySignatures;
- internal readonly RestoreActionConfig restoreActionConfig;
+ internal readonly RestoreActionConfig _restoreActionConfig;
public ToolInstallGlobalOrToolPathCommand(
ParseResult parseResult,
PackageId? packageId = null,
- CreateToolPackageStoresAndDownloaderAndUninstaller createToolPackageStoreDownloaderUninstaller = null,
- CreateShellShimRepository createShellShimRepository = null,
- IEnvironmentPathInstruction environmentPathInstruction = null,
- IReporter reporter = null,
- INuGetPackageDownloader nugetPackageDownloader = null,
- IToolPackageStoreQuery store = null,
- string currentWorkingDirectory = null,
+ CreateToolPackageStoresAndDownloaderAndUninstaller? createToolPackageStoreDownloaderUninstaller = null,
+ CreateShellShimRepository? createShellShimRepository = null,
+ IEnvironmentPathInstruction? environmentPathInstruction = null,
+ IReporter? reporter = null,
+ INuGetPackageDownloader? nugetPackageDownloader = null,
+ IToolPackageStoreQuery? store = null,
+ string? currentWorkingDirectory = null,
bool? verifySignatures = null)
: base(parseResult)
{
@@ -92,11 +88,11 @@ public ToolInstallGlobalOrToolPathCommand(
var configOption = parseResult.GetValue(ToolInstallCommandParser.ConfigOption);
var sourceOption = parseResult.GetValue(ToolInstallCommandParser.AddSourceOption);
var packageSourceLocation = new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), additionalSourceFeeds: sourceOption, basePath: _currentWorkingDirectory);
- restoreActionConfig = new RestoreActionConfig(DisableParallel: parseResult.GetValue(ToolCommandRestorePassThroughOptions.DisableParallelOption),
+ _restoreActionConfig = new RestoreActionConfig(DisableParallel: parseResult.GetValue(ToolCommandRestorePassThroughOptions.DisableParallelOption),
NoCache: parseResult.GetValue(ToolCommandRestorePassThroughOptions.NoCacheOption) || parseResult.GetValue(ToolCommandRestorePassThroughOptions.NoHttpCacheOption),
IgnoreFailedSources: parseResult.GetValue(ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption),
Interactive: parseResult.GetValue(ToolCommandRestorePassThroughOptions.InteractiveRestoreOption));
- nugetPackageDownloader ??= new NuGetPackageDownloader.NuGetPackageDownloader(tempDir, verboseLogger: new NullLogger(), restoreActionConfig: restoreActionConfig, verbosityOptions: _verbosity, verifySignatures: verifySignatures ?? true);
+ nugetPackageDownloader ??= new NuGetPackageDownloader.NuGetPackageDownloader(tempDir, verboseLogger: new NullLogger(), restoreActionConfig: _restoreActionConfig, verbosityOptions: _verbosity, verifySignatures: verifySignatures ?? true, shouldUsePackageSourceMapping: true);
_shellShimTemplateFinder = new ShellShimTemplateFinder(nugetPackageDownloader, tempDir, packageSourceLocation);
_store = store;
@@ -125,10 +121,7 @@ public override int Execute()
{
if (_updateAll)
{
- var toolListCommand = new ToolListGlobalOrToolPathCommand(
- _parseResult
- , toolPath => { return _store; }
- );
+ var toolListCommand = new ToolListGlobalOrToolPathCommand(_parseResult, toolPath => { return _store; });
var toolIds = toolListCommand.GetPackages(null, null);
foreach (var toolId in toolIds)
{
@@ -136,15 +129,25 @@ public override int Execute()
}
return 0;
}
- else
+
+ if (_packageId is null)
{
- return ExecuteInstallCommand((PackageId)_packageId);
+ throw new GracefulException(CliCommandStrings.ToolInstallPackageIdMissing);
}
+
+ return ExecuteInstallCommand((PackageId)_packageId);
}
private int ExecuteInstallCommand(PackageId packageId)
{
- ValidateArguments();
+ using var _activity = Activities.Source.StartActivity("install-tool");
+ _activity?.DisplayName = $"Install {packageId}";
+ _activity?.SetTag("toolId", packageId);
+
+ if (!string.IsNullOrEmpty(_configFilePath) && !File.Exists(_configFilePath))
+ {
+ throw new GracefulException(string.Format(CliCommandStrings.ToolInstallNuGetConfigurationFileDoesNotExist, Path.GetFullPath(_configFilePath)));
+ }
DirectoryPath? toolPath = null;
if (!string.IsNullOrEmpty(_toolPath))
@@ -152,7 +155,7 @@ private int ExecuteInstallCommand(PackageId packageId)
toolPath = new DirectoryPath(_toolPath);
}
- VersionRange versionRange = _parseResult.GetVersionRange();
+ VersionRange? versionRange = _parseResult.GetVersionRange();
(IToolPackageStore toolPackageStore,
IToolPackageStoreQuery toolPackageStoreQuery,
@@ -162,22 +165,24 @@ private int ExecuteInstallCommand(PackageId packageId)
var appHostSourceDirectory = ShellShimTemplateFinder.GetDefaultAppHostSourceDirectory();
IShellShimRepository shellShimRepository = _createShellShimRepository(appHostSourceDirectory, toolPath);
- IToolPackage oldPackageNullable = GetOldPackage(toolPackageStoreQuery, packageId);
+ IToolPackage? oldPackageNullable = GetOldPackage(toolPackageStoreQuery, packageId);
- if (oldPackageNullable != null)
+ if (oldPackageNullable is not null)
{
NuGetVersion nugetVersion = GetBestMatchNugetVersion(packageId, versionRange, toolPackageDownloader);
+ _activity?.DisplayName = $"Install {packageId}@{nugetVersion}";
+ _activity?.SetTag("toolVersion", nugetVersion);
if (ToolVersionAlreadyInstalled(oldPackageNullable, nugetVersion))
{
_reporter.WriteLine(string.Format(CliCommandStrings.ToolAlreadyInstalled, oldPackageNullable.Id, oldPackageNullable.Version.ToNormalizedString()).Green());
return 0;
- }
+ }
}
TransactionalAction.Run(() =>
{
- if (oldPackageNullable != null)
+ if (oldPackageNullable is not null)
{
RunWithHandlingUninstallError(() =>
{
@@ -188,8 +193,9 @@ private int ExecuteInstallCommand(PackageId packageId)
RunWithHandlingInstallError(() =>
{
+ var toolPackageDownloaderActivity = Activities.Source.StartActivity("download-tool-package");
IToolPackage newInstalledPackage = toolPackageDownloader.InstallPackage(
- new PackageLocation(nugetConfig: GetConfigFile(), sourceFeedOverrides: _source, additionalFeeds: _addSource),
+ new PackageLocation(nugetConfig: GetConfigFile(), sourceFeedOverrides: _source, additionalFeeds: _addSource),
packageId: packageId,
versionRange: versionRange,
targetFramework: _framework,
@@ -197,12 +203,13 @@ private int ExecuteInstallCommand(PackageId packageId)
isGlobalTool: true,
isGlobalToolRollForward: _allowRollForward,
verifySignatures: _verifySignatures ?? true,
- restoreActionConfig: restoreActionConfig
+ restoreActionConfig: _restoreActionConfig
);
+ toolPackageDownloaderActivity?.Dispose();
EnsureVersionIsHigher(oldPackageNullable, newInstalledPackage, _allowPackageDowngrade);
- NuGetFramework framework;
+ NuGetFramework? framework;
if (string.IsNullOrEmpty(_framework) && newInstalledPackage.Frameworks.Count() > 0)
{
framework = newInstalledPackage.Frameworks
@@ -211,13 +218,12 @@ private int ExecuteInstallCommand(PackageId packageId)
}
else
{
- framework = string.IsNullOrEmpty(_framework) ?
- null :
- NuGetFramework.Parse(_framework);
+ framework = string.IsNullOrEmpty(_framework) ? null : NuGetFramework.Parse(_framework);
}
+ var shimActivity = Activities.Source.StartActivity("create-shell-shim");
string appHostSourceDirectory = _shellShimTemplateFinder.ResolveAppHostSourceDirectoryAsync(_architectureOption, framework, RuntimeInformation.ProcessArchitecture).Result;
-
shellShimRepository.CreateShim(newInstalledPackage.Command, newInstalledPackage.PackagedShims);
+ shimActivity?.Dispose();
foreach (string w in newInstalledPackage.Warnings)
{
@@ -231,47 +237,36 @@ private int ExecuteInstallCommand(PackageId packageId)
PrintSuccessMessage(oldPackageNullable, newInstalledPackage);
}, packageId);
});
+
return 0;
}
- private NuGetVersion GetBestMatchNugetVersion(PackageId packageId, VersionRange versionRange, IToolPackageDownloader toolPackageDownloader)
+ private NuGetVersion GetBestMatchNugetVersion(PackageId packageId, VersionRange? versionRange, IToolPackageDownloader toolPackageDownloader)
{
return toolPackageDownloader.GetNuGetVersion(
packageLocation: new PackageLocation(nugetConfig: GetConfigFile(), sourceFeedOverrides: _source, additionalFeeds: _addSource),
packageId: packageId,
versionRange: versionRange,
verbosity: _verbosity,
- restoreActionConfig: restoreActionConfig
+ restoreActionConfig: _restoreActionConfig
).version;
}
- private static bool ToolVersionAlreadyInstalled(IToolPackage oldPackageNullable, NuGetVersion nuGetVersion)
+ private static bool ToolVersionAlreadyInstalled(IToolPackage? oldPackageNullable, NuGetVersion nuGetVersion)
{
return oldPackageNullable != null && oldPackageNullable.Version == nuGetVersion;
}
- private static void EnsureVersionIsHigher(IToolPackage oldPackageNullable, IToolPackage newInstalledPackage, bool allowDowngrade)
+ private static void EnsureVersionIsHigher(IToolPackage? oldPackageNullable, IToolPackage newInstalledPackage, bool allowDowngrade)
{
if (oldPackageNullable != null && newInstalledPackage.Version < oldPackageNullable.Version && !allowDowngrade)
{
throw new GracefulException(
- [
- string.Format(CliCommandStrings.UpdateToLowerVersion,
- newInstalledPackage.Version.ToNormalizedString(),
- oldPackageNullable.Version.ToNormalizedString())
- ],
- isUserError: false);
- }
- }
-
- private void ValidateArguments()
- {
- if (!string.IsNullOrEmpty(_configFilePath) && !File.Exists(_configFilePath))
- {
- throw new GracefulException(
- string.Format(
- CliCommandStrings.ToolInstallNuGetConfigurationFileDoesNotExist,
- Path.GetFullPath(_configFilePath)));
+ [
+ string.Format(CliCommandStrings.UpdateToLowerVersion,
+ newInstalledPackage.Version.ToNormalizedString(),
+ oldPackageNullable.Version.ToNormalizedString())
+ ], isUserError: false);
}
}
@@ -288,9 +283,7 @@ private static void RunWithHandlingInstallError(Action installAction, PackageId
{
string.Format(CliCommandStrings.UpdateToolFailed, packageId)
};
- message.AddRange(
- InstallToolCommandLowLevelErrorConverter.GetUserFacingMessages(ex, packageId));
-
+ message.AddRange(InstallToolCommandLowLevelErrorConverter.GetUserFacingMessages(ex, packageId));
throw new GracefulException(
messages: message,
@@ -303,7 +296,7 @@ private static void RunWithHandlingUninstallError(Action uninstallAction, Packag
{
try
{
- uninstallAction();
+ uninstallAction();
}
catch (Exception ex)
when (ToolUninstallCommandLowLevelErrorConverter.ShouldConvertToUserFacingError(ex))
@@ -312,8 +305,7 @@ private static void RunWithHandlingUninstallError(Action uninstallAction, Packag
{
string.Format(CliCommandStrings.UpdateToolFailed, packageId)
};
- message.AddRange(
- ToolUninstallCommandLowLevelErrorConverter.GetUserFacingMessages(ex, packageId));
+ message.AddRange(ToolUninstallCommandLowLevelErrorConverter.GetUserFacingMessages(ex, packageId));
throw new GracefulException(
messages: message,
@@ -333,29 +325,25 @@ private static void RunWithHandlingUninstallError(Action uninstallAction, Packag
return configFile;
}
- private static IToolPackage GetOldPackage(IToolPackageStoreQuery toolPackageStoreQuery, PackageId packageId)
+ private static IToolPackage? GetOldPackage(IToolPackageStoreQuery toolPackageStoreQuery, PackageId packageId)
{
- IToolPackage oldPackageNullable;
+ IToolPackage? oldPackageNullable;
try
{
oldPackageNullable = toolPackageStoreQuery.EnumeratePackageVersions(packageId).SingleOrDefault();
}
catch (InvalidOperationException)
{
- throw new GracefulException(
- messages:
- [
- string.Format(
- CliCommandStrings.ToolUpdateToolHasMultipleVersionsInstalled,
- packageId),
- ],
- isUserError: false);
+ throw new GracefulException(messages:
+ [
+ string.Format(CliCommandStrings.ToolUpdateToolHasMultipleVersionsInstalled, packageId)
+ ], isUserError: false);
}
return oldPackageNullable;
}
- private void PrintSuccessMessage(IToolPackage oldPackage, IToolPackage newInstalledPackage)
+ private void PrintSuccessMessage(IToolPackage? oldPackage, IToolPackage newInstalledPackage)
{
if (!_verbosity.IsQuiet())
{
@@ -381,7 +369,6 @@ private void PrintSuccessMessage(IToolPackage oldPackage, IToolPackage newInstal
{
_reporter.WriteLine(
string.Format(
-
newInstalledPackage.Version.IsPrerelease ?
CliCommandStrings.UpdateSucceededPreVersionNoChange : CliCommandStrings.UpdateSucceededStableVersionNoChange,
newInstalledPackage.Id, newInstalledPackage.Version).Green());
diff --git a/src/Cli/dotnet/Commands/Tool/Run/ToolRunCommand.cs b/src/Cli/dotnet/Commands/Tool/Run/ToolRunCommand.cs
index ee0e2aa63f46..3f8f97aa68d6 100644
--- a/src/Cli/dotnet/Commands/Tool/Run/ToolRunCommand.cs
+++ b/src/Cli/dotnet/Commands/Tool/Run/ToolRunCommand.cs
@@ -1,27 +1,21 @@
// 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 System.CommandLine;
using Microsoft.DotNet.Cli.CommandFactory;
using Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
-using Microsoft.DotNet.Cli.Commands.Tool.Install;
-using Microsoft.DotNet.Cli.NuGetPackageDownloader;
using Microsoft.DotNet.Cli.ToolManifest;
-using Microsoft.DotNet.Cli.ToolPackage;
using Microsoft.DotNet.Cli.Utils;
-using Microsoft.Extensions.EnvironmentAbstractions;
namespace Microsoft.DotNet.Cli.Commands.Tool.Run;
internal class ToolRunCommand(
ParseResult result,
- LocalToolsCommandResolver localToolsCommandResolver = null,
- ToolManifestFinder toolManifest = null) : CommandBase(result)
+ LocalToolsCommandResolver? localToolsCommandResolver = null,
+ ToolManifestFinder? toolManifest = null) : CommandBase(result)
{
- private readonly string _toolCommandName = result.GetValue(ToolRunCommandParser.CommandNameArgument);
- private readonly IEnumerable _forwardArgument = result.GetValue(ToolRunCommandParser.CommandArgument);
+ private readonly string? _toolCommandName = result.GetValue(ToolRunCommandParser.CommandNameArgument);
+ private readonly IEnumerable? _forwardArgument = result.GetValue(ToolRunCommandParser.CommandArgument);
private readonly LocalToolsCommandResolver _localToolsCommandResolver = localToolsCommandResolver ?? new LocalToolsCommandResolver(toolManifest);
public bool _allowRollForward = result.GetValue(ToolRunCommandParser.RollForwardOption);
@@ -30,14 +24,15 @@ public override int Execute()
{
return ExecuteCommand(_localToolsCommandResolver, _toolCommandName, _forwardArgument, _allowRollForward);
}
- public static int ExecuteCommand(LocalToolsCommandResolver commandResolver, string toolCommandName, IEnumerable argumentsToForward, bool allowRollForward)
+
+ public static int ExecuteCommand(LocalToolsCommandResolver commandResolver, string? toolCommandName, IEnumerable? argumentsToForward, bool allowRollForward)
{
+ using var _ = Activities.Source.StartActivity("execute-local-tool");
CommandSpec commandSpec = commandResolver.ResolveStrict(new CommandResolverArguments()
{
// since LocalToolsCommandResolver is a resolver, and all resolver input have dotnet-
CommandName = $"dotnet-{toolCommandName}",
CommandArguments = argumentsToForward,
-
}, allowRollForward);
if (commandSpec == null)
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf
index 64a073d7c81c..ef0be1f8743e 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf
@@ -3184,6 +3184,11 @@ Nástroj {1} (verze {2}) byl úspěšně nainstalován.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Nahradit všechny zdroje balíčků NuGet, které se mají použít při instalaci, těmito zdroji.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf
index 109c182e2e04..ff95f50432e4 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf
@@ -3184,6 +3184,11 @@ Das Tool "{1}" (Version {2}) wurde erfolgreich installiert.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Ersetzen alle NuGet-Paketquellen für die Nutzung während der Installation durch diese.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf
index 4b52ce438a03..cafa00504648 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf
@@ -3184,6 +3184,11 @@ La herramienta "{1}" (versión '{2}') se instaló correctamente.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Reemplazar todos los orígenes de paquetes NuGet que se usarán durante la instalación por estos.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf
index b82c108765ca..aeb4f9c69848 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf
@@ -3184,6 +3184,11 @@ L'outil '{1}' (version '{2}') a été installé correctement.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Remplacer toutes les sources de package NuGet à utiliser pendant l’installation par celles-ci.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf
index 36ce6c7bf784..76d952d70f60 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf
@@ -3184,6 +3184,11 @@ Lo strumento '{1}' (versione '{2}') è stato installato.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Sostituire tutte le origini del pacchetto NuGet da usare durante l'installazione con queste.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf
index ec5845275adf..b61a60dd3def 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf
@@ -3184,6 +3184,11 @@ Tool '{1}' (version '{2}') was successfully installed.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
インストール中に使用するすべての NuGet パッケージ ソースをこれらに置き換えます。
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf
index 24a33bd40fbe..dded1cadb955 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf
@@ -3184,6 +3184,11 @@ Tool '{1}' (version '{2}') was successfully installed.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
설치 중에 사용할 모든 NuGet 패키지 원본을 이러한 패키지 원본으로 바꿉니다.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf
index 3ab929146205..2d42ab586840 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf
@@ -3184,6 +3184,11 @@ Pomyślnie zainstalowano narzędzie „{1}” (wersja: „{2}”).
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Zastąp je wszystkimi źródłami pakietów NuGet, które mają być używane podczas instalacji.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf
index c2d3b8d5b224..9d361c694c87 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf
@@ -3184,6 +3184,11 @@ A ferramenta '{1}' (versão '{2}') foi instalada com êxito.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Substitua todas as fontes de pacote NuGet a serem usadas durante a instalação por estas.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ru.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ru.xlf
index 1b9fb6f85c3c..1344f5200f51 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ru.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.ru.xlf
@@ -3184,6 +3184,11 @@ Tool '{1}' (version '{2}') was successfully installed.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Замените ими все источники пакетов NuGet, которые будут использоваться при установке.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.tr.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.tr.xlf
index 9009d605ee54..68b149de64ca 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.tr.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.tr.xlf
@@ -3184,6 +3184,11 @@ Tool '{1}' (version '{2}') was successfully installed.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
Yükleme sırasında kullanılacak tüm NuGet paket kaynaklarını bu kaynaklarla değiştirin.
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hans.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hans.xlf
index f0de7d31f629..9c26d32eeafe 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hans.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hans.xlf
@@ -3184,6 +3184,11 @@ Tool '{1}' (version '{2}') was successfully installed.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
将安装期间要使用的所有 NuGet 包源替换为这些源。
diff --git a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hant.xlf b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hant.xlf
index 6b6ec748e046..08028a384d3a 100644
--- a/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hant.xlf
+++ b/src/Cli/dotnet/Commands/xlf/CliCommandStrings.zh-Hant.xlf
@@ -3184,6 +3184,11 @@ Tool '{1}' (version '{2}') was successfully installed.
PACKAGE_ID
+
+ A package ID was not specified for tool installation.
+ A package ID was not specified for tool installation.
+
+
Replace all NuGet package sources to use during installation with these.
以這些套件取代安裝期間使用的所有 NuGet 套件來源。
diff --git a/src/Cli/dotnet/InteractiveConsole.cs b/src/Cli/dotnet/InteractiveConsole.cs
index 2b6a6fdcbd58..1ce4d4f8535e 100644
--- a/src/Cli/dotnet/InteractiveConsole.cs
+++ b/src/Cli/dotnet/InteractiveConsole.cs
@@ -4,6 +4,7 @@
using System.CommandLine;
using System.Diagnostics.CodeAnalysis;
using Microsoft.DotNet.Cli.Commands;
+using Microsoft.DotNet.Cli.Utils;
namespace Microsoft.DotNet.Cli;
@@ -30,6 +31,8 @@ public static class InteractiveConsole
return null;
}
+ using var _ = Activities.Source.StartActivity("confirm-run-from-source");
+
Console.Write(AddPromptOptions(message));
while (true)
diff --git a/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs b/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs
index 4ed187cc92dc..72366d0126e6 100644
--- a/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs
+++ b/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs
@@ -66,9 +66,11 @@ protected override NuGetVersion DownloadAndExtractPackage(
string? folderToDeleteOnFailure = null;
return TransactionalAction.Run(() =>
{
+ var _downloadActivity = Activities.Source.StartActivity("download-tool");
+ _downloadActivity?.DisplayName = $"Downloading tool {packageId}@{packageVersion}";
var packagePath = nugetPackageDownloader.DownloadPackageAsync(packageId, packageVersion, packageSourceLocation,
includeUnlisted: includeUnlisted, downloadFolder: new DirectoryPath(packagesRootPath)).ConfigureAwait(false).GetAwaiter().GetResult();
-
+ _downloadActivity?.Stop();
folderToDeleteOnFailure = Path.GetDirectoryName(packagePath);
// look for package on disk and read the version
@@ -81,6 +83,7 @@ protected override NuGetVersion DownloadAndExtractPackage(
var packageHash = Convert.ToBase64String(new CryptoHashProvider("SHA512").CalculateHash(reader.GetNuspec()));
var hashPath = versionFolderPathResolver.GetHashPath(packageId.ToString(), version);
+
Directory.CreateDirectory(Path.GetDirectoryName(hashPath)!);
File.WriteAllText(hashPath, packageHash);
}
@@ -90,8 +93,10 @@ protected override NuGetVersion DownloadAndExtractPackage(
Reporter.Output.WriteLine($"Extracting package {packageId}@{packageVersion} to {packagePath}");
}
// Extract the package
+ var _extractActivity = Activities.Source.StartActivity("extract-tool");
var nupkgDir = versionFolderPathResolver.GetInstallPath(packageId.ToString(), version);
nugetPackageDownloader.ExtractPackageAsync(packagePath, new DirectoryPath(nupkgDir)).ConfigureAwait(false).GetAwaiter().GetResult();
+ _extractActivity?.Stop();
return version;
}, rollback: () =>
diff --git a/src/Cli/dotnet/ToolPackage/ToolPackageDownloaderBase.cs b/src/Cli/dotnet/ToolPackage/ToolPackageDownloaderBase.cs
index 28a8e7973846..134d02d19b53 100644
--- a/src/Cli/dotnet/ToolPackage/ToolPackageDownloaderBase.cs
+++ b/src/Cli/dotnet/ToolPackage/ToolPackageDownloaderBase.cs
@@ -187,8 +187,10 @@ protected IToolPackage InstallGlobalToolPackageInternal(
// Create parent directory in global tool store, for example dotnet\tools\.store\powershell
_fileSystem.Directory.CreateDirectory(toolStoreTargetDirectory.GetParentPath().Value);
+ var _moveContentActivity = Activities.Source.StartActivity("move-global-tool-content");
// Move tool files from stage to final location
FileAccessRetrier.RetryOnMoveAccessFailure(() => _fileSystem.Directory.Move(_globalToolStageDir.Value, toolStoreTargetDirectory.Value));
+ _moveContentActivity?.Dispose();
rollbackDirectory = toolStoreTargetDirectory.Value;
@@ -374,6 +376,7 @@ protected void UpdateRuntimeConfig(
ToolPackageInstance toolPackageInstance
)
{
+ using var _updateRuntimeConfigActivity = Activities.Source.StartActivity("update-runtimeconfig");
var runtimeConfigFilePath = Path.ChangeExtension(toolPackageInstance.Command.Executable.Value, ".runtimeconfig.json");
// Update the runtimeconfig.json file
diff --git a/test/dotnet.Tests/CommandTests/Tool/Install/ToolInstallGlobalOrToolPathCommandTests.cs b/test/dotnet.Tests/CommandTests/Tool/Install/ToolInstallGlobalOrToolPathCommandTests.cs
index ea127f2fbba0..8b1f84c62cc8 100644
--- a/test/dotnet.Tests/CommandTests/Tool/Install/ToolInstallGlobalOrToolPathCommandTests.cs
+++ b/test/dotnet.Tests/CommandTests/Tool/Install/ToolInstallGlobalOrToolPathCommandTests.cs
@@ -89,7 +89,7 @@ public void WhenPassingRestoreActionConfigOptions()
{
var parseResult = Parser.Parse($"dotnet tool install -g {PackageId} --ignore-failed-sources");
var toolInstallCommand = new ToolInstallGlobalOrToolPathCommand(parseResult);
- toolInstallCommand.restoreActionConfig.IgnoreFailedSources.Should().BeTrue();
+ toolInstallCommand._restoreActionConfig.IgnoreFailedSources.Should().BeTrue();
}
[Fact]
diff --git a/test/dotnet.Tests/CommandTests/Tool/Update/ToolUpdateGlobalOrToolPathCommandTests.cs b/test/dotnet.Tests/CommandTests/Tool/Update/ToolUpdateGlobalOrToolPathCommandTests.cs
index 846a2c423d9a..7bc758e8fd07 100644
--- a/test/dotnet.Tests/CommandTests/Tool/Update/ToolUpdateGlobalOrToolPathCommandTests.cs
+++ b/test/dotnet.Tests/CommandTests/Tool/Update/ToolUpdateGlobalOrToolPathCommandTests.cs
@@ -108,7 +108,7 @@ public void WhenPassingRestoreActionConfigOptions()
{
var parseResult = Parser.Parse($"dotnet tool update -g {_packageId} --ignore-failed-sources");
var toolUpdateCommand = new ToolUpdateGlobalOrToolPathCommand(parseResult);
- toolUpdateCommand._toolInstallGlobalOrToolPathCommand.restoreActionConfig.IgnoreFailedSources.Should().BeTrue();
+ toolUpdateCommand._toolInstallGlobalOrToolPathCommand._restoreActionConfig.IgnoreFailedSources.Should().BeTrue();
}
[Fact]