Как убедиться, что используется манифест модуля PowerShell (.psd1)

Я создал модуль PowerShell MyUtil.psm1 и файл манифеста MyUtil.psd1 для него. В файле psd1 он имеет префикс, определенный для предотвращения конфликтов имен для экспортируемых функций:

DefaultCommandPrefix = 'MyToolbox'

Таким образом, после запуска Import-Module .\MyUtil.psd1 функция как Get-Command в файле psm1 будет Get-MyToolboxCommand, Все отлично. Но если кто-то бежит Import-Module .\MyUtil.psm1 чтобы импортировать файл psm1 напрямую, файл psd1 просто не используется, и префикс, который я хочу, не будет применен.

Если я хочу предотвратить это (импортировать MyUtil.psm1 напрямую), есть ли способ разрешить ТОЛЬКО импорт соответствующего файла манифеста psd1 вместо файла psm1? Или программным способом обнаружить, что этот модуль не был импортирован через psd1, чтобы я мог предупредить пользователя использовать psd1?

1 ответ

Хорошо, это немного раздражает, но это работает. Вы можете использовать командлет Export-ModuleMember без аргументов, чтобы остановить экспорт psm1, но вам нужно отправить значение из psd1 в psm1 во время импорта. Таким образом, мы знаем, когда нас вызывают с psd1. Итак, во-первых, добавьте значение в хеш-таблицу PrivateData в вашем PSD:

    PrivateData = @{
    FromPSD = $true       
    PSData = @{

Затем вам нужно получить к нему доступ в файле psm1. Вы можете использовать функцию, но не встроенную функцию, поэтому мы должны вставить ее в функцию.

function Get-PD
{
    [CmdletBinding()]
    $MyInvocation.MyCommand.Module.PrivateData
}

(Я полностью украл это из этого SO-ответа Доступ к PrivateData во время Import-Module).

Затем вы завершаете все это, вызывая этот код в модуле, который будет запускаться при загрузке модуля.

$MyPD = Get-PD
if($MyPD.Count -eq 0)
{
    Export-ModuleMember
}

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

Ты можешь использовать: #Requires

Например:

Требовать установки Hyper-V (версии 1.1 или выше).

#Requires -Modules @{ ModuleName="Hyper-V"; ModuleVersion="1.1" }

Требуется установка Hyper-V (только версия 1.1).

#Requires -Modules @{ ModuleName="Hyper-V"; RequiredVersion="1.1" }

Требуется установка любой версии PSScheduledJob и PSWorkflow.

#Requires -Modules PSWorkflow, PSScheduledJob

О Требуется

Другие вопросы по тегам