Как управлять зависимостями между скриптами в многофайловом модуле Powershell?

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

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

Я провел некоторое тестирование, и мне кажется, что можно переместить команду Export-ModuleMember для каждой функции в отдельные файлы .ps1; это больше похоже на функции, объявляющие свою собственную область видимости, такие как общедоступная и частная область видимости в C #. Однако после этого мой файл .psm1 не содержит ничего, кроме этого:

Get-ChildItem -recurse $psScriptRoot | where { $_.Extension -eq ".ps1" } | foreach { . $_.FullName }

Это кажется правильным? Все скрипты получают точечный источник, и все скрипты ссылаются друг на друга в соответствии с этим предположением. Должны ли они вместо этого ссылаться друг на друга, используя свое местоположение относительно $ psScriptRoot?

Есть ли способ, отличный от обоих этих способов? Кто-нибудь может дать совет? Я пока мало что знаю об этом.


person bwerks    schedule 02.06.2011    source источник


Ответы (2)


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

Эта строка представляет собой модуль PSRemoteRegistry:

Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName }

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

person Chad Miller    schedule 03.06.2011
comment
Я вроде как делаю это, но группирую несколько похожих функций в один скрипт, а не каждую в отдельный файл. - person JasonMArcher; 18.06.2011

вы также можете посмотреть на создание манифеста (я действительно не знаю, нужен ли вам psm1 с psd1).

Вот мое использование манифеста:

New-ModuleManifest `
    -Path Fiddler.psd1 `
    -Author "Niklas Goude" `
    -CompanyName "http://www.powershell.nu/" `
    -ModuleVersion 1.0 `
    -Description "Module from http://www.powershell.nu/2011/03/14/fiddler/</a> - psd1 created by Matt @ amonskeysden.tumblr.com" `
    -FormatsToProcess @() `
    -RequiredAssemblies @("Fiddler.dll") `
    -NestedModules @() `
    -Copyright "" `
    -ModuleToProcess "Fiddler.psm1" `
    -TypesToProcess @() `
    -FileList @("Fiddler.psm1","Fiddler.dll")

Я думаю, что ответом на ваш вопрос будет включение вашего списка файлов в параметр FileList.

Я написал некоторые из своих выводов (включая ссылки на ресурсы MS) здесь:

http://amonkeysden.tumblr.com/post/5127684898/powershell-and-fiddler

person Matt    schedule 03.06.2011
comment
Проблема в том, что он по-прежнему не экспортирует команды, поэтому get-command -module Fiddler будет показывать команды, которые делает этот модуль доступным. - person Josiah; 12.09.2012