Функция дочернего модуля, измененная в области сценария, возвращается, когда выполнение достигает дочернего модуля - по дизайну?

Сценарий (.ps1) импортирует ModuleA, который импортирует ModuleB. В сценарии я вижу функцию из ModuleB (с Get-Command), но она указана как принадлежащая ModuleA. Я также могу изменить/удалить функцию. Когда выполнение попадает в ModuleA, функция из ModuleB указывается как принадлежащая ModuleB (через Get-Command) и возвращается в исходное состояние.

Это по дизайну?

пример:

Invoke-Greeting.ps1

Import-Module .\Import-First.psm1

Get-Command -Module "Import-First"     # Write-Greetings and Write-Goodbye
Get-Command -Module "Import-Second"    # no functions found
Get-Command -Name "Write-Goodbye"      # Write-Goodbye (module = Import-First) ***is this by design?***

Remove-Item "function:\Write-Goodbye"

Get-Command -Module "Import-First"     # Write-Greetings
Get-Command -Module "Import-Second"    # no functions found
Get-Command -Name "Write-Goodbye"      # error: function doesn't exist (expected)

Write-Greetings

Импорт-First.psm1

Import-Module .\Import-Second.psm1
function Write-Greetings
{
    Write-Host "hello world!"              # hello world!
    Get-Command -Module "Import-First"     # Write-Greetings
    Get-Command -Module "Import-Second"    # Write-GoodBye
    Get-Command -Name "Write-GoodBye"      # Write-GoodBye (module = Import-Second) ***module changed since execution scope changed***

    Write-GoodBye
}

Импорт-Второй.psm1

function Write-Goodbye
{    
    Write-Host "bye bye!"
}

person user2562172    schedule 09.07.2013    source источник


Ответы (1)


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

Я рекомендую не вкладывать модули. Импортируйте каждый модуль отдельно. Лучше всего создать собственный Import-Module.ps1 скрипт для каждого модуля, который сначала импортирует зависимости этого модуля, а затем импортирует сам модуль. Итак, в вашем случае,

Импорт-First.ps1

& Import-Second.ps1
Import-Module First.psm1

Импорт-Second.ps1

Import-Module Second.psm1

Invoke-Greeting.ps1

& .\Import-First.ps1

Get-Command -Module "First"     # Write-Greetings and Write-Goodbye
Get-Command -Module "Second"    # no functions found
Get-Command -Name "Write-Goodbye"      # Write-Goodbye (module = Import-First) ***is this by design?***

& .\Import-Second.ps1

Get-Command -Module "First"     # Write-Greetings
Get-Command -Module "Second"    # Write-Goodbye found
Get-Command -Name "Write-Goodbye"      # function exists because it is in Second module.

Write-Greetings

Вы не должны создавать модули с конфликтующими именами. Второй модуль всегда перезаписывает функции/командлеты/переменные первого модуля, если они имеют одинаковые имена. Вы можете использовать параметр -NoClobber Import-Module, чтобы предотвратить перезапись кода.

person Aaron Jensen    schedule 09.07.2013