Как управлять зависимостями между скриптами в многофайловом модуле Powershell? - PullRequest
6 голосов
/ 03 июня 2011

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 03 июня 2011

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

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

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

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

4 голосов
/ 03 июня 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

...