Модуль PowerShell, вызов функции в NestedModule из другого NestedModule - PullRequest
0 голосов
/ 28 марта 2019

У меня есть модуль Powershell, и в манифесте я объявил основной модуль и два вложенных модуля.Структура модуля выглядит следующим образом:

- [dir] Pivot.DockerAdmin
    - [manifest] Pivot.DockerAdmin.psd1
    - [main module file] Pivot.DockerAdmin.psm1
    - [nested script] DockerfileScripts.ps1
    - [nested script] DockerCliScripts.ps1

Что работает Основной модуль (Pivot.DockerAdmin.psm1) может вызывать функции в файлах вложенного модуля (оба DockerfileScripts.ps1,DockerCliScripts.ps1), без проблем.Обратите внимание, что нет специальной логики для включения этих файлов, кроме записи в файле манифеста.

Что НЕ работает Один файл сценария для вложенного модуля (DockerfileScripts.ps1) не может вызывать функции вдругой файл сценария для вложенного модуля (DockerCliScripts.ps1).

Вложенные модули - это просто простые файлы сценариев.Поэтому я использую концепцию NestedModule для логической группировки некоторых функций в других файлах.

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

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

Если это невозможно, есть ли какие-либо рекомендации по организациифайлы сценариев в модулях PS, так что возможно подобное разделение сценариев / разделение задач?

1 Ответ

0 голосов
/ 16 мая 2019

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

https://stackoverflow.com/a/55064995/7710456

Я немного подробнее остановлюсь на этом.

Я еще раз посмотрю на негои создал манифест модуля для всех модулей, и все эти модули должны соответствовать стандартам для модулей PowerShell (в папке с тем же именем, что и у модуля PowerShell, в месте, которое присутствует в PSModulePath)

Write-BazFunctions.psm1:

Function Write-Baz {
    return "Baz"
}

Write-BarFunctions.psm1:

Function Write-Bar {
    return "Bar"
}

Function Write-BarBaz {
    $bar = Write-Bar;
    $baz = Write-Baz;
    return ("{0}{1}" -f $bar, $baz)
}

Write-FooFunctions.psm1

Function Write-Foo {
    return "Foo"
}

Function Write-FooBar {
    $foo = Write-Foo
    $bar = Write-Bar
    return ("{0}{1}" -f $foo, $bar)
}

Function Write-FooBarBaz {
    $foobar = Write-FooBar
    $baz = Write-Baz
    return ("{0}{1}" -f $foobar, $baz)
}

Function Write-FooBazBar {
    $foo = Write-Foo
    $bar = Write-Bar
    $baz = Write-Baz
    return ("{0}{1}{2}" -f $foo, $bar, $baz)
}

Сейчас - различия.В манифесте для функций Write-BarFunctions (примечание требуется, не вложено):

RequiredModules = @('Write-BazFunctions')

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

Как только я это сделал, я смог импортировать функции Write-FooFunctions, и все функции стали доступны.Поскольку Write-BarBaz в Write-BarFunctions вызывает Write-Baz из Write-BazFunctions, вы можете видеть, что это позволит вложенным модулям ссылаться друг на друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...