Модуль обновления дублирует модуль вместо обновления
Я использую 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 отображаются дубликаты для каждой функции:
Обновить
@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'".
Проверьте, какая версия действительно импортирована:
- Начать новый
powershell
приставка - Бежать
Get-Module
чтобы MyModule вообще не импортировался - Запустите любой командлет из MyModule
- Убедитесь, что только одна последняя версия 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
Надеюсь это поможет:)