Модуль обновления дублирует модуль вместо обновления

Я использую PowerShellGet для установки моего собственного модуля PowerShell из моего локального фида Nuget (упакован и опубликован как здесь).

Я устанавливаю его один раз так:

Install-Module MyModule -Scope CurrentUser

И тогда я обновляю это так:

Update-Module MyModule

Работает как положено, но после каждого обновления версии я получаю дубликат модуля вместо переопределения:

Get-Module MyModule -ListAvailable

# Output
    Directory: C:\Users\user\Documents\WindowsPowerShell\Modules

ModuleType Version    Name       ExportedCommands
---------- -------    ----       ----------------
Manifest   1.0.0.40   MyModule   {...}
Manifest   1.0.0.39   MyModule   {...}
Manifest   1.0.0.38   MyModule   {...}

Функции, которые были удалены в последней версии, остаются доступными, а в автозаполнении PowerShell ISE отображаются дубликаты для каждой функции:

пример в powershell_ise


Обновить

@CmdrTchort предложил дополнительные проверки для расследования, вот результаты.

Проверьте, где установлены модули

Get-Module -Name MyModule -ListAvailable | %{ $_.ModuleBase }

Как и ожидалось, PowerShellGet установил их в %USERPROFILE%\Documents\WindowsPowerShell\Modules:

C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.1.1
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.40
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.39
C:\Users\user\Documents\WindowsPowerShell\Modules\MyModule\1.0.0.38

я вижу это $PSScriptRoot содержит этот путь.

Проверьте, что будет делать модуль обновления

Update-Module -Name MyModule -WhatIf
# Result
# What if: Performing the operation "Update-Module" on target "Version '1.0.1.1' of module 'MyModule', updating to version '1.0.1.2'".

Проверьте, какая версия действительно импортирована:

  1. Начать новый powershell приставка
  2. Бежать Get-Module чтобы MyModule вообще не импортировался
  3. Запустите любой командлет из MyModule
  4. Убедитесь, что только одна последняя версия MyModule была импортирована путем выполнения Get-Module снова

Для меня это:

ModuleType Version    Name       ExportedCommands
---------- -------    ----       ----------------
Manifest   1.0.1.2    MyModule   {...

Заключение

Кажется, что здесь нет никаких проблем, как писал @CmdrTchort, ожидается, что Get-Module -ListAvailable показывает все установленные версии.

Я думаю, что поведение автозаполнения PowerShell в powershell и powershell_ise немного сбивает с толку, хотя оно показывает дубликаты одной и той же функции, если доступно несколько версий и функции, удаленные из последней версии, вероятно, будут вскоре изменены или каким-то образом настроены.

1 ответ

Решение

Как вы упаковываете свой модуль, когда вы упаковываете свои новые версии?

Powershell поддерживает загрузку нескольких версий одного и того же модуля (ListAvailable предоставляет различные версии).

Можете ли вы сделать Get-module MyModule -ListAvailable и распечатать полный путь к модулю, чтобы проверить, как они установлены?

Вы обновляете свой Module-manifest для каждой версии и упаковываете его в новую папку?

Вы можете загрузить обе версии одного и того же модуля в свою сессию Powershell; если это так, то последние импортированные командлеты являются эффективными.

Модуль импорта также поддерживает -MimimumVersion или RequiredVersion.

Поскольку у вас возникают проблемы с обычным модулем импорта, я подозреваю, что что-то не так с его структурой и PSModulePath.

Может быть, $PSModulePath объединяется с путем "версия" для каждого нового обновления вместо обновления, как это обычно делается? В таком случае; "первая" версия может быть загруженной, получая правило приоритета над другой. Я бы сделал быструю проверку, чтобы увидеть, что находится в $PSModulePath.

Когда вы делаете модуль обновления, проверьте, что он обновляет с ключом -WhatIf.

Некоторые ссылки для установки модулей / работы с модулями:

https://msdn.microsoft.com/en-us/library/dd878350(VS.85).aspx

https://technet.microsoft.com/en-us/library/dn807166.aspx

Надеюсь это поможет:)

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