我有一个构建脚本,该脚本依赖于我们模块之一的较旧版本。版本 1.0.1 。我在-MaximumVersion 1.0.1
命令中添加了Import-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 。
如何确保脚本导入并使用旧版本的模块?
添加了-Verbose
开关以获取有关正在发生的事情的更多详细信息。结果如下:
详细:从路径' C:\ Program加载模块 Files \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 1.0.1 \ DrilQuip.Build.psd1'。 详细信息:填充模块的RepositorySourceLocation属性 DrilQuip.Build。
创建下一个版本号... 在此对象上找不到属性“ VersionFilePath”。验证 属性存在。 在 C:\ Users \ svcTFSBuildProd \ Documents \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 2.1.0 \ DrilQuip.Build.psm1:253 char:5 + $ Matches =选择字符串-Path $ global:BuildConfig.VersionFilePat ...
这表明同一模块已安装到2个不同的位置。位置 C:\ Users \ svcTFSBuildProd ... 似乎胜过位置 C:\ Program Files \ WindowsPowerShell ...
我认为这与模块安装上的“机器与用户”作用域有关。我将返回并删除User作用域的模块,并使用Machine scope安装该模块的所有版本,看看是否有帮助。
我从用户范围文件夹中删除了该模块的所有版本,然后再次尝试了该脚本。仍然失败,但是现在两个版本的模块都来自相同的模块文件夹位置。
详细:从路径' C:\ Program加载模块 Files \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 1.0.1 \ DrilQuip.Build.psd1'。 详细信息:填充模块的RepositorySourceLocation属性 DrilQuip.Build。 正在创建下一个版本号... 在此对象上找不到属性“ VersionFilePath”。验证 属性存在。 在 C:\ Program 文件\ WindowsPowerShell \ Modules \ DrilQuip.Build \ 2.0.4 \ DrilQuip.Build.psm1:251 字符:5
由于新版本仍然胜过最高版本,因此我要求我的理论是用户范围胜过机器范围不是真正的问题。发生了其他事情。
我再次运行Get-Module -Name DrilQuip.Build -ListAvailable
,我注意到ModuleType是不同的。在版本 1.0.1 上,类型为清单,但是在版本 1.1.1 和 2.0.4 上,类型为脚本。也许是这种差异导致了问题。
ModuleType Version Name
---------- ------- ----
Script 2.0.4 DrilQuip.Build
Script 1.1.1 DrilQuip.Build
Manifest 1.0.1 DrilQuip.Build
我将删除所有模块,然后从存储库中重新安装它们。
答案 0 :(得分:1)
模块旧版本 1.0.1 的类型为清单,此后的所有版本均为 Script 。模块的下一版本 1.0.2 也与我的构建脚本兼容,因此我将-MaximumVersion
参数更改为 1.0.2 。
在尝试之前,我还卸载了计算机上模块的所有版本,然后仅安装了确实需要的版本 1.0.2 和 2.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文件,因此无法导出函数。