Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/Cli/dotnet/CliStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,12 @@ setx PATH "%PATH%;{0}"
<data name="MissingToolSettingsFile" xml:space="preserve">
<value>Settings file 'DotnetToolSettings.xml' was not found in the package.</value>
</data>
<data name="ToolRequiresHigherDotNetVersion" xml:space="preserve">
<value>Tool '{0}' requires a higher version of .NET than is currently installed. The tool targets {1}, but the current runtime is {2}.</value>
</data>
<data name="ToolRequiresHigherDotNetVersionSuggestion" xml:space="preserve">
<value>To install this tool, upgrade to .NET {0} or later, or install a version of the tool that is compatible with .NET {1}.</value>
</data>
<data name="ToolPackageConflictPackageId" xml:space="preserve">
<value>Tool '{0}' (version '{1}') is already installed.</value>
</data>
Expand Down
54 changes: 47 additions & 7 deletions src/Cli/dotnet/ToolPackage/ToolPackageInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,21 @@ public ToolPackageInstance(PackageId id,
ResolvedPackageVersion = Version;
}

var toolConfiguration = DeserializeToolConfiguration(library, packageDirectory, _fileSystem);
Warnings = toolConfiguration.Warnings;

var installPath = new VersionFolderPathResolver(PackageDirectory.Value).GetInstallPath(ResolvedPackageId.ToString(), ResolvedPackageVersion);
var toolsPackagePath = Path.Combine(installPath, "tools");
Frameworks = _fileSystem.Directory.EnumerateDirectories(toolsPackagePath)
.Select(path => NuGetFramework.ParseFolder(Path.GetFileName(path))).ToList();

// Get available frameworks before deserializing tool configuration
// This allows us to provide better error messages if the tool requires a higher .NET version
List<NuGetFramework> availableFrameworks = [];
if (_fileSystem.Directory.Exists(toolsPackagePath))
{
availableFrameworks = _fileSystem.Directory.EnumerateDirectories(toolsPackagePath)
.Select(path => NuGetFramework.ParseFolder(Path.GetFileName(path))).ToList();
}
Frameworks = availableFrameworks;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of loading the available frameworks here and passing them to DeserializeToolConfiguration, load them in DeserializeToolConfiguration only if the tool settings aren't found.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactored in commit 008fccc. Framework enumeration now happens inside DeserializeToolConfiguration only when the tool settings file is not found, reducing unnecessary filesystem operations when tools install successfully.


var toolConfiguration = DeserializeToolConfiguration(library, packageDirectory, ResolvedPackageId, availableFrameworks, _fileSystem);
Warnings = toolConfiguration.Warnings;

LockFileItem entryPointFromLockFile = FindItemInTargetLibrary(library, toolConfiguration.ToolAssemblyEntryPoint);
if (entryPointFromLockFile == null)
Expand Down Expand Up @@ -165,17 +173,49 @@ public static ToolConfiguration GetToolConfiguration(PackageId id,
{
var lockFile = new LockFileFormat().Read(assetsJsonParentDirectory.WithFile(AssetsFileName).Value);
var lockFileTargetLibrary = FindLibraryInLockFile(lockFile);
return DeserializeToolConfiguration(lockFileTargetLibrary, packageDirectory, fileSystem);
// For this method, we don't have framework information available, so pass empty list
return DeserializeToolConfiguration(lockFileTargetLibrary, packageDirectory, id, [], fileSystem);

}

private static ToolConfiguration DeserializeToolConfiguration(LockFileTargetLibrary library, DirectoryPath packageDirectory, IFileSystem fileSystem)
private static ToolConfiguration DeserializeToolConfiguration(LockFileTargetLibrary library, DirectoryPath packageDirectory, PackageId packageId, IReadOnlyList<NuGetFramework> availableFrameworks, IFileSystem fileSystem)
{
try
{
var dotnetToolSettings = FindItemInTargetLibrary(library, ToolSettingsFileName);
if (dotnetToolSettings == null)
{
// Check if this is because of framework incompatibility
if (availableFrameworks.Count > 0)
{
var currentFramework = new NuGetFramework(FrameworkConstants.FrameworkIdentifiers.NetCoreApp, new Version(Environment.Version.Major, Environment.Version.Minor));

// Find the minimum framework version required by the tool
var minRequiredFramework = availableFrameworks
.Where(f => f.Framework == FrameworkConstants.FrameworkIdentifiers.NetCoreApp)
.MinBy(f => f.Version);

// If all available frameworks require a higher version than current runtime
if (minRequiredFramework != null && minRequiredFramework.Version > currentFramework.Version)
{
var requiredVersionString = $".NET {minRequiredFramework.Version.Major}.{minRequiredFramework.Version.Minor}";
var currentVersionString = $".NET {currentFramework.Version.Major}.{currentFramework.Version.Minor}";

var errorMessage = string.Format(
CliStrings.ToolRequiresHigherDotNetVersion,
packageId,
requiredVersionString,
currentVersionString);

var suggestion = string.Format(
CliStrings.ToolRequiresHigherDotNetVersionSuggestion,
minRequiredFramework.Version.Major,
currentFramework.Version.Major);

throw new ToolConfigurationException($"{errorMessage} {suggestion}");
}
}

throw new ToolConfigurationException(
CliStrings.MissingToolSettingsFile);
}
Expand Down
10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.ru.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Cli/dotnet/xlf/CliStrings.tr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading