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