首页 > 解决方案 > 为什么在 -MaximumVersion 设置为较低版本的情况下导入时运行较新版本的 PowerShell 模块?

问题描述

我有一个依赖于我们模块之一的旧版本的构建脚本。版本1.0.1。我添加-MaximumVersion 1.0.1Import-Module命令中。当构建脚本运行时它失败并且错误显示它正在运行模块版本2.1.0中的代码。

Import-Module DrilQuip.Build -MaximumVersion 1.0.1 -Force

正在创建下一个版本号... 在此对象上找不到属性“VersionFilePath”。验证该属性是否存在。在 C:\Users\svcTFSBuildProd\Documents\WindowsPowerShell\Modules\DrilQuip.Build\ 2.1.0 \DrilQuip.Build.psm1:253 char:5

我尝试过使用和不使用-Force开关,但这没有区别。

我曾经Get-Module DrilQuip.Build -ListAvailable确认计算机上存在版本1.0.1

如何确保脚本导入并使用旧版本的模块?

更新 1

添加-Verbose了开关以获取有关正在发生的事情的更多详细信息。结果如下:

详细:从路径“ C:\Program Files\WindowsPowerShell\Modules\DrilQuip.Build\1.0.1 \DrilQuip.Build.psd1”加载模块。详细:填充模块 DrilQuip.Build 的 RepositorySourceLocation 属性。

正在创建下一个版本号... 在此对象上找不到属性“VersionFilePath”。验证该属性是否存在。在C:\Users\svcTFSBuildProd\Documents\WindowsPowerShell\Modules\DrilQuip.Build\ 2.1.0 \DrilQuip.Build.psm1:253 char:5 + $Matches = Select-String -Path $global:BuildConfig.VersionFilePat ...

这表明同一个模块已安装到 2 个不同的位置。位置C:\Users\svcTFSBuildProd...似乎胜过位置C:\Program Files\WindowsPowerShell...

我认为这与模块安装上的机器与用户范围有关。我将返回并删除用户范围的模块并安装具有机器范围的模块的所有版本,看看是否有帮助。

更新 2

我从用户范围文件夹中删除了该模块的所有版本,然后再次尝试了该脚本。它仍然失败,但现在模块的两个版本都来自同一个模块文件夹位置。

详细:从路径“ C:\Program Files\WindowsPowerShell\Modules\DrilQuip.Build\1.0.1 \DrilQuip.Build.psd1”加载模块。详细:填充模块 DrilQuip.Build 的 RepositorySourceLocation 属性。正在创建下一个版本号... 在此对象上找不到属性“VersionFilePath”。验证该属性是否存在。在C:\Program Files\WindowsPowerShell\Modules\DrilQuip.Build\2.0.4 \DrilQuip.Build.psm1:251 char:5

由于新版本仍然胜过最大版本,我要求我的理论是用户范围胜过机器范围并不是真正的问题。其他事情正在发生。

Get-Module -Name DrilQuip.Build -ListAvailable再次运行,发现 ModuleType 不同。在1.0.1版本上,类型是Manifest,但在1.1.12.0.4版本上,类型是Script。也许这种差异导致了问题。

ModuleType Version    Name          
---------- -------    ----          
Script     2.0.4      DrilQuip.Build
Script     1.1.1      DrilQuip.Build
Manifest   1.0.1      DrilQuip.Build

我将删除所有模块并从存储库中重新安装它们。

标签: powershellmoduleside-by-side

解决方案


模块1.0.1的旧版本具有Manifest类型,之后的所有版本都是Script类型。模块1.0.2的下一个版本也与我的构建脚本兼容,因此我将-MaximumVersion参数更改为1.0.2

在尝试之前,我还卸载了计算机上所有版本的模块,然后只安装了真正需要的1.0.22.1.0版本。我以管理员身份运行 PowerShell,因此两个模块都安装到文件夹中C:\Program Files\WindowsPowerShell\Modules

PS C:\Program Files\WindowsPowerShell\Modules\DrilQuip.Build> get-module DrilQuip.Build -li

    Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     2.1.0      DrilQuip.Build                      {Start-Build, Write-FileCopyResult, Invoke-MSBuild, New-Da...
Script     1.0.2      DrilQuip.Build                      {Get-NextVersion, Set-TfsWorkspaceFileTime}

在这些更改之后,构建脚本可以正常工作并按预期使用 1.0.2 版本的代码。

VERBOSE: Loading module from path 'C:\Program 
Files\WindowsPowerShell\Modules\DrilQuip.Build\1.0.2\DrilQuip.Build.psd1'.
VERBOSE: Populating RepositorySourceLocation property for module 
DrilQuip.Build.
VERBOSE: Loading module from path 'C:\Program 
Files\WindowsPowerShell\Modules\DrilQuip.Build\1.0.2\DrilQuip.Build.psm1'.
VERBOSE: Importing function 'Get-NextVersion'.
VERBOSE: Importing function 'Set-TfsWorkspaceFileTime'.

Creating next version number...
New version: 10.2.10928.11004

根据 mklement0 的评论,似乎整个问题是版本 1.0.1 设置不正确,因此没有导入任何功能。Import-Module 的详细输出证实了这一点。当脚本调用 Get-NextVersion 函数时,PowerShell 使用模块自动加载来查找并加载具有该函数的模块版本。

版本 1.0.1 在清单中缺少 RootModule 的值。该错误已在 1.0.2 版中修复。该模块使用 Export-ModuleMember 来导出函数,而不是清单中的 FunctionsToExport 设置。由于 1.0.1 没有将根模块设置为 psm1 文件,因此无法导出函数..


推荐阅读