Почему новая версия модуля PowerShell запускается, когда я импортирую с -MaximumVersion, установленным на более низкую версию? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть скрипт сборки, который зависит от более старой версии одного из наших модулей.Версия 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 ...

Я думаю, что это нужно сделатьс машиной против пользовательской области при установке модуля.Я вернусь и удалю модули с пользовательской областью и установлю все версии модуля с областью действия Машины и посмотрю, поможет ли это.

Обновление 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 char: 5

Поскольку новая версия все еще превосходит максимальнуюВерсия Я запросил мою теорию о том, что пользовательский охват превосходит машинный объем не является реальной проблемой.Что-то еще происходит.

Я снова запустил Get-Module -Name DrilQuip.Build -ListAvailable, и я заметил, что ModuleType отличается.В версии 1.0.1 тип Манифест , но в версиях 1.1.1 и 2.0.4 тип Script.Возможно, это различие вызывает проблему.

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

Я удалю все модули и переустановлю их из репозитория.

1 Ответ

0 голосов
/ 28 февраля 2019

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

...