Манифест модуля PowerShell - автоматическая загрузка необходимого модуля - PullRequest
8 голосов
/ 30 марта 2011

Я создаю модуль, который зависит от нескольких других модулей, которые мне нужно загрузить в глобальную среду. Я попытался создать сценарий и использовать ScriptsToProcess для импорта модулей, но похоже, что проверка RequiredModules происходит перед запуском ScriptstoProcess.

Есть ли хороший, чистый способ в Манифесте модуля требовать модуль и загружать его автоматически, если он еще не загружен? Если модуль не может быть загружен, то RequiredModule выдаст ошибку.

Ответы [ 2 ]

9 голосов
/ 10 мая 2012

PowerShell V3 работает несколько иначе.Необходимые модули теперь загружаются при загрузке манифеста с указанным ключом.Кроме того, удаление модуля не выгружает необходимый модуль, независимо от того, как этот модуль был загружен.Интересно, что -Force, похоже, не показывает автозагрузку требуемых модулей.


Редактировать: Если ваш модуль не находится в одном из местоположений по умолчанию, вам нужно будет добавить путь кэтот модуль (или родительская папка, в которой находится модуль) для переменной $env:PSModulePath.


Примечание: с PSv3 в scripts * 1010 есть поддержка команды #Requires*.Вы можете использовать это, чтобы (1) попытаться загрузить зависимость модуля в ваш скрипт и (2) завершить работу, если модуль не / не может быть загружен.

#Requires -Modules ModuleName1,ModuleName2

Для этого также необходимо, чтобы модули находились где-то под$env:PSModulePath, который должен быть установлен до запуска скрипта.

8 голосов
/ 30 марта 2011

В PowerShell 3 и выше Обязательные модули автоматически загружаются

Это также единственный способ убедиться, что люди, использующие PowerShellGet (то есть Галерея PowerShell ), установят ваши зависимости, если вы собираетесь распространять модуль.

Он все равно потерпит неудачу, если необходимые модули отсутствуют, но в остальном работает точно так, как вы этого хотите.

В PowerShell 2 нет способа автоматически загрузить RequiredModules

В любом случае пользователи могут вручную загрузить требования, набрав Import-Module RequiredModule, YourModule - они не получат второй экземпляр, если он уже импортирован ...

Вы также можете указать модуль в NestedModules. Даже в PowerShell 2 они загружаются «внутри» вашего модуля, но, похоже, не оказывает негативного влияния на ресурсы, когда они уже загружены. Однако, как напомнил мне @JasonMArcher, в PowerShell 2 NestedModules выгружаются вместе с вашим модулем, если ваш модуль выгружается (через Remove-Module), и это происходит , даже если они были предварительно загружены отдельно пользователь, который может в конечном итоге создавать действительно странные отчеты об ошибках, поскольку ваши пользователи этого не ожидают.

Другой вариант, , который работает во всех версиях PowerShell , заключается в вызове Import-Module в верхней части вашего модуля (в скрипте psm1 после проверки, чтобы убедиться, что модуль еще не загружен) с установленным -ErrorAction Stop, так что импорт вашего модуля не удастся, если импорт зависимого модуля не удастся.

if (!(Get-Module Dependency)) { ## Or check for the cmdlets you need
    ## Load it nested, and we'll automatically remove it during clean up
    Import-Module Dependency -ErrorAction Stop
}

На самом деле, если вы хотите проверить версии ...

if (!(Get-Module Dependency | Where { $_.Version -ge "2.5" )) { 
    ## Load version 2.5 (or newer), or die 
    Import-Module Dependency -Version 2.5 -ErrorAction Stop
}

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

...