Какова цель файлов * .psm1 в модуле Powershell? - PullRequest
1 голос
/ 27 апреля 2019

Итак, я реализовал свой первый модуль Powershell с кучей файлов .ps1 (по одному на функцию) и файлом манифеста .psd1.

Я пытаюсь понять, какова цель .psm1 файлы - нужны ли они вообще в моем модуле?

Какова их добавленная стоимость?

РЕДАКТИРОВАТЬ 1

Вот мой .psd1 file:

@{
    ModuleVersion = "0.0.19106.59054"
    GUID = "59bc8fa6-b480-4226-9bcc-ec243102f3cc"
    Author = "..."
    CompanyName = "..."
    Copyright = "..."
    Description = "..."
    ScriptsToProcess = "vsts\config.ps1"
    VariablesToExport = @(
        "TfsInstanceUrl",
        "TfsApiVersion",
        "QANuGetRepoUrl"
    )
    NestedModules = @(
        "db\Backup-Database.ps1",
        ...
        "vsts\work\Get-WorkItems.ps1"
    )
    FunctionsToExport = @(
        "Assert-ExtractionDestFolder",
        ...
        "Write-HostIfNotVerbose"
    )
    PrivateData = @{
        PSData = @{
            ExternalModuleDependencies = "SqlServer"
        }
    }
}

Как я уже сказал, каждая функция находится в своем собственном файле.

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

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

0 голосов
/ 27 апреля 2019

.psm1 - это файл powershellmodule.Когда мы создаем модуль скрипта, мы записываем все функции модуля в файл .psm1, затем мы экспортируем функции, а затем мы можем использовать эти функции, импортируя модуль..psm1 в основном ссылается на модуль powershell.Powershell напрямую идентифицирует все, что написано в этом файле, будет частью модуля.

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