mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Include Module Version in error messages when module is not found (#20144)
This commit is contained in:
@@ -306,7 +306,7 @@ namespace System.Management.Automation
|
||||
ScriptRequiresException scriptRequiresException =
|
||||
new ScriptRequiresException(
|
||||
scriptInfo.Name,
|
||||
new Collection<string> { requiredModule.Name },
|
||||
new Collection<string> { requiredModule.GetRequiredModuleNotFoundVersionMessage() },
|
||||
"ScriptRequiresMissingModules",
|
||||
false,
|
||||
error);
|
||||
|
||||
@@ -165,6 +165,49 @@ namespace Microsoft.PowerShell.Commands
|
||||
return null;
|
||||
}
|
||||
|
||||
internal string GetRequiredModuleNotFoundVersionMessage()
|
||||
{
|
||||
if (RequiredVersion is not null)
|
||||
{
|
||||
return StringUtil.Format(
|
||||
Modules.RequiredModuleNotFoundRequiredVersion,
|
||||
Name,
|
||||
RequiredVersion);
|
||||
}
|
||||
|
||||
bool hasVersion = Version is not null;
|
||||
bool hasMaximumVersion = MaximumVersion is not null;
|
||||
|
||||
if (hasVersion && hasMaximumVersion)
|
||||
{
|
||||
return StringUtil.Format(
|
||||
Modules.RequiredModuleNotFoundModuleAndMaximumVersion,
|
||||
Name,
|
||||
Version,
|
||||
MaximumVersion);
|
||||
}
|
||||
|
||||
if (hasVersion)
|
||||
{
|
||||
return StringUtil.Format(
|
||||
Modules.RequiredModuleNotFoundModuleVersion,
|
||||
Name,
|
||||
Version);
|
||||
}
|
||||
|
||||
if (hasMaximumVersion)
|
||||
{
|
||||
return StringUtil.Format(
|
||||
Modules.RequiredModuleNotFoundMaximumVersion,
|
||||
Name,
|
||||
MaximumVersion);
|
||||
}
|
||||
|
||||
return StringUtil.Format(
|
||||
Modules.RequiredModuleNotFoundWithoutVersion,
|
||||
Name);
|
||||
}
|
||||
|
||||
internal ModuleSpecification(PSModuleInfo moduleInfo)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(moduleInfo);
|
||||
|
||||
@@ -231,6 +231,21 @@
|
||||
<data name="RequiredModuleNotLoadedWrongMinimumVersionAndMaximumVersion" xml:space="preserve">
|
||||
<value>The required module '{1}' with MinimumVersion '{2}' and MaximumVersion '{3}' is not loaded. Load the module or remove the module from 'RequiredModules' in the file '{0}'.</value>
|
||||
</data>
|
||||
<data name="RequiredModuleNotFoundModuleVersion" xml:space="preserve">
|
||||
<value>The module '{0}' cannot be found with ModuleVersion '{1}'.</value>
|
||||
</data>
|
||||
<data name="RequiredModuleNotFoundRequiredVersion" xml:space="preserve">
|
||||
<value>The module '{0}' cannot be found with RequiredVersion '{1}'.</value>
|
||||
</data>
|
||||
<data name="RequiredModuleNotFoundMaximumVersion" xml:space="preserve">
|
||||
<value>The module '{0}' cannot be found with MaximumVersion '{1}'.</value>
|
||||
</data>
|
||||
<data name="RequiredModuleNotFoundModuleAndMaximumVersion" xml:space="preserve">
|
||||
<value>The module '{0}' cannot be found with ModuleVersion '{1}' and MaximumVersion '{2}'.</value>
|
||||
</data>
|
||||
<data name="RequiredModuleNotFoundWithoutVersion" xml:space="preserve">
|
||||
<value>The module '{0}' cannot be found.</value>
|
||||
</data>
|
||||
<data name="NoModulesRemoved" xml:space="preserve">
|
||||
<value>No modules were removed. Verify that the specification of modules to remove is correct and those modules exist in the runspace.</value>
|
||||
</data>
|
||||
|
||||
@@ -118,21 +118,73 @@ Describe "#requires -Modules" -Tags "CI" {
|
||||
$badName = 'ModuleThatDoesNotExist'
|
||||
$badPath = Join-Path $TestDrive 'ModuleThatDoesNotExist'
|
||||
$version = '1.0'
|
||||
$requiredVersion = '1.1'
|
||||
$maximumVersion = '1.2'
|
||||
$testCases = @(
|
||||
@{ ModuleRequirement = "'$badName'"; Scenario = 'name' }
|
||||
@{ ModuleRequirement = "'$badPath'"; Scenario = 'path' }
|
||||
@{ ModuleRequirement = "@{ ModuleName = '$badName'; ModuleVersion = '$version' }"; Scenario = 'fully qualified name with name' }
|
||||
@{ ModuleRequirement = "@{ ModuleName = '$badPath'; ModuleVersion = '$version' }"; Scenario = 'fully qualified name with path' }
|
||||
@{
|
||||
ModuleRequirement = $badName
|
||||
Scenario = 'fully qualified with module name'
|
||||
ExpectedMessageStrings = @($badName)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = $badPath
|
||||
Scenario = 'fully qualified with module path'
|
||||
ExpectedMessageStrings = @($badPath)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badName'; ModuleVersion = '$version' }"
|
||||
Scenario = 'fully qualified with module name and version'
|
||||
ExpectedMessageStrings = @($badName, $version)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badPath'; ModuleVersion = '$version' }"
|
||||
Scenario = 'fully qualified with module name and version'
|
||||
ExpectedMessageStrings = @($badPath, $version)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badName'; RequiredVersion = '$requiredVersion' }"
|
||||
Scenario = 'fully qualified with module name and required version'
|
||||
ExpectedMessageStrings = @($badName, $requiredVersion)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badPath'; RequiredVersion = '$requiredVersion' }"
|
||||
Scenario = 'fully qualified with module path and required version'
|
||||
ExpectedMessageStrings = @($badPath, $requiredVersion)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badName'; MaximumVersion = '$maximumVersion' }"
|
||||
Scenario = 'fully qualified with module name and maximum version'
|
||||
ExpectedMessageStrings = @($badName, $maximumVersion)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badPath'; MaximumVersion = '$maximumVersion' }"
|
||||
Scenario = 'fully qualified with module path and maximum version'
|
||||
ExpectedMessageStrings = @($badPath, $maximumVersion)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badName'; ModuleVersion = '$version'; MaximumVersion = '$maximumVersion' }"
|
||||
Scenario = 'fully qualified with module name and version and maximum version'
|
||||
ExpectedMessageStrings = @($badName, $version, $maximumVersion)
|
||||
}
|
||||
@{
|
||||
ModuleRequirement = "@{ ModuleName = '$badPath'; ModuleVersion = '$version'; MaximumVersion = '$maximumVersion' }"
|
||||
Scenario = 'fully qualified with module path and version and maximum version'
|
||||
ExpectedMessageStrings = @($badPath, $version, $maximumVersion)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
It "Fails parsing a script that requires module by <Scenario>" -TestCases $testCases {
|
||||
param([string]$ModuleRequirement, [string]$Scenario)
|
||||
param([string]$ModuleRequirement, [string]$Scenario, [string[]]$ExpectedMessageStrings)
|
||||
|
||||
$script = "#requires -Modules $ModuleRequirement`n`nWrite-Output 'failed'"
|
||||
$null = New-Item -Path $scriptPath -Value $script -Force
|
||||
|
||||
{ & $scriptPath } | Should -Throw -ErrorId 'ScriptRequiresMissingModules'
|
||||
$ex = { & $scriptPath } | Should -Throw -ErrorId 'ScriptRequiresMissingModules' -PassThru
|
||||
|
||||
$expectedPattern = $ExpectedMessageStrings.ForEach{ [regex]::Escape($_) } -join '|'
|
||||
$stringMatches = [regex]::Matches($ex.Exception.Message, $expectedPattern)
|
||||
$stringMatches | Should -HaveCount $ExpectedMessageStrings.Count
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user