Почему новая версия модуля 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, у него не было возможности экспортировать функции.

Другие вопросы по тегам