Почему новая версия модуля PowerShell запускается, когда я импортирую с -MaximumVersion, установленным на более низкую версию?
У меня есть скрипт сборки, который зависит от старой версии одного из наших модулей. Версия 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 присутствует на компьютере.
Как я могу гарантировать, что скрипт импортирует и использует более старую версию модулей?
Обновление 1
добавленной -Verbose
переключиться, чтобы получить более подробную информацию о том, что происходит. Вот результаты:
VERBOSE: загрузка модуля из пути 'C: \ Program Files \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 1.0.1\ DrilQuip.Build.psd1'. VERBOSE: Заполнение свойства RepositorySourceLocation для модуля DrilQuip.Build.
Создание следующего номера версии... Свойство '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...
Я думаю, что это связано с областью Machine vs User при установке модуля. Я вернусь и удалю модули с пользовательской областью и установлю все версии модуля с областью действия машины и посмотрю, поможет ли это.
Обновление 2
Я удалил все версии модуля из пользовательской папки, а затем снова попробовал скрипт. Это все еще терпит неудачу, но теперь обе версии модуля прибывают из того же самого местоположения папки модуля.
VERBOSE: загрузка модуля из пути 'C: \ Program Files \ WindowsPowerShell \ Modules \ DrilQuip.Build \ 1.0.1\ DrilQuip.Build.psd1'. VERBOSE: Заполнение свойства RepositorySourceLocation для модуля DrilQuip.Build. Создание следующего номера версии... Свойство 'VersionFilePath' не может быть найдено для этого объекта. Убедитесь, что свойство существует. В C: \ Program Files \ 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
Я удалю все модули и переустановлю их из репозитория.
1 ответ
Более старая версия модуля 1.0.1 имеет тип Manifest, и все версии после этого имеют тип 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, у него не было возможности экспортировать функции.