для чего нужны файлы .psm1
- они мне вообще нужны в моем модуле?
В скриптовые модули , т. Е. Модули, созданные в PowerShell (в отличие от скомпилированных двоичных командлетов), только файлы *.psm1
предоставляют специфичное для модуля поведение, отличное от обычных *.ps1
файлов сценариев (отдельные, изолированные области действия, частные команды, управление экспортируемыми командами).
Как правило, манифест модуля скрипта содержит запись RootModule
, указывающую на (основной) файл *.psm1
; для меньших модулей весьма обычно для всех функциональных возможностей модуля, которые будут реализованы в этом одном *.psm1
файле.
Фактически, автономный файл *.psm1
также может выступать в качестве модуля, хотя он не интегрируется с функцией автоматического обнаружения и автозагрузки модуля PowerShell.
Обратите внимание, что если бы вы использовали обычный *.ps1
скрипт непосредственно в RootModule
, его определения были бы загружены в область вызывающей стороны , а не в модуль; то есть вы потеряете преимущества модуля.
Несмотря на то, что вы перечисляете обычные сценарии *.ps1
в своей записи манифеста NestedModules
, благодаря использованию этой конкретной записи эти сценарии получают из точек * в модуле и тем самым становятся частью модуля :
Это концептуально эквивалентно созданию корневого сценария *.psm1
и обращению к нему в RootModule
и - вместо определения записи NestedModules
- явному точечному поиску сценариев *.ps1
из - см. Нижнюю часть.
Обратите внимание, что если бы вы ссылались на *.psm1
файлы в NestedModules
, они действительно стали бы вложенными модулями со своими собственными областями действия; вложенный модуль можно использовать из прилагаемого модуля, но он не виден внешнему миру (хотя вы можете перечислить его среди загруженных модулей с помощью Get-Module -All
).
Список *.ps1
файлов в NesteModules
и точечный источник их из RootModule
Хотя не должно быть никакой разницы в функциональности, использование *.psm1
RootModule
для точечного источника файлов *.ps1
, содержащих функции вашего модуля, может потенциально упростить вещи, , если , вам просто нужно поставить точку -source все *.ps1
файлы, расположенные в поддереве каталога вашего модуля:
# Add this to the *.psm1 file specified in 'RootModule'
# Find all *.ps1 files in the module's subtree and dot-source them
foreach ($script in
(Get-ChildItem -File -Recurse -LiteralPath $PSScriptRoot -Filter *.ps1)
) {
. $script
}
Если вам нужно загрузить скрипты в определенном порядке, вам нужно только подмножество скриптов или вы хотите немного ускорить процесс (хотя я сомневаюсь, что разница в скорости будет заметна), вы можете использовать точечный источник файлов индивидуально из файла RootModule
*.psm1
, в качестве альтернативы перечислению их в записи NestedModules
:
# Add this to the *.psm1 file specified in 'RootModule'
# Dot-source the *.ps1 files individually.
. "$PSScriptRoot/db/Backup-Database.ps1"
# ...
. "$PSScriptRoot/vsts/work/Get-WorkItems.ps1"
Опять же, все вышеперечисленные подходы являются функционально эквивалентными.
Учитывая, что вы явно экспортируете функции через запись ExportedFunctions
(что целесообразно), использование файлов *.ps1
, которые должны иметь точечный источник, в конечном счете, является деталью реализации, которая не имеет отношения к целям обнаружения команд и автоматического модуля. загрузка - имеет значение только при фактическом времени импорта.