Импорт-модуль PowerShell vs Dot Sourcing
Если я хочу отделить некоторые из своих функций от моего основного PowerShell script, я могу либо написать это как файл .ps1
file и dot source, либо я могу создать это как .psm1
и импортировать используя Import-Module
.
Какой из них лучше и почему?
Ответы
Ответ 1
Модули лучше всего подходят для библиотек. Они дают вам больше контроля над тем, что экспортируется из модуля. Это по умолчанию все переменные script в файле PSM1 являются закрытыми - не видны вне модуля при импорте. Аналогично, все функции являются общедоступными. Однако вы можете использовать Export-ModuleMember в вашем файле PSM1, чтобы точно контролировать, какие переменные, функции, псевдонимы, командлеты и т.д. Вы экспортируете из своего модуля. Модули также можно удалить из сеанса, что является существенным отличием от dotsourcing.PS1 script. Другое отличие состоит в том, что функции модуля являются именами, размещаемыми модулем, в котором они находятся, поэтому вы можете легко получить доступ к одинаково названным модулям, предварительно указав имя модуля и "\" на имя функции, например. PSCX\Get-Uptime. В ISE этот префикс также вызывает поддержку intellisense.
Я вообще рекомендую ходить с модулями.: -)
Ответ 2
Dotsourcing + script и модули - это две разные вещи. Модули отлично подходят для сбора/группировки функций и командлетов, которые вы использовали бы в script. Если у вас есть функции, которые вы хотите использовать в интерактивном режиме (вы вызываете функцию в консоли), тогда модуль может отлично подходить.
Если у вас есть один большой script, с которым вы запускаете, скажите "перенести общий ресурс файла" или один script, который вы называете регулярным, используя Task Scheduler, а затем dot-sourcing проще.
Это зависит от того, что вам нужно. Реферат:
- Если вы просто используете функции/скрипты в ЭТОЙ ситуации (script/job) = используйте источник точки.
- Если вы используете общие функции / script, которые также используются в других сценариях, или вы хотите вызвать некоторые из функций в интерактивном режиме и т.д. = использовать модуль.
Ответ 3
Несколько дополнительных функций модуля в дополнение к другим ответам.
-
В PowerShell V3 не нужно вызывать Import-Module
, чтобы использовать экспортированные команды. Это особенно полезно, когда команды используются в интерактивном режиме. PowerShell как-то кэширует и знает все доступные команды модуля и даже их помощь Get-Help SomeCommand
(это не так для справки модуля Get-Help about_SomeModule
, хотя).
-
Существует несколько тонких различий в поведении функций с точками и функции модуля script. Перечислить их все непросто, вот только один пример:
Странное поведение с областью и модулями переменных Scriptblock Powershell, любые предложения?
Иногда использование модулей script становится болезненным, особенно когда вы обнаруживаете нежелательные различия и проблемы слишком поздно, то есть простые вещи прекрасно работают в начале разработки, но сложные вещи начинают ошибаться позже.
В целом, обычно я использую модули, кроме случаев, когда они плохо работают. Один из них вызывает пользовательские блоки script, переданные в модульных функциях script.