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

Скрипт (.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

Import-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
}

Import-Second.psm1

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

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


Отговори (1)


да Когато импортирате модул в рамките на модул, функциите на вложения модул действат така, сякаш са част от родителския модул. Когато импортирате модул, можете да експортирате конкретни членове на този модул в глобалния обхват. Изтриването на тези обекти с глобален обхват не засяга вътрешния модул.

Препоръчвам да не влагате модули. Импортирайте всеки модул отделно. Най-добре е да създадете персонализиран Import-Module.ps1 скрипт за всеки модул, който първо импортира зависимостите на този модул, след което импортира самия модул. Така че във вашия случай,

Import-First.ps1

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

Import-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