Фон
Я бы хотел, чтобы все мои скрипты и модули были основаны на шаблонном скрипте, который заботится о некоторых типичных «домашних делах».
Некоторые из моих модулей взаимозависимы, и поэтому я могу загрузить модуль внутри другого модуля, даже если он временно.
Однако, поскольку код является шаблонным, основные функции инициализации имеют одинаковые имена.
На мой взгляд, это не должно быть проблемой, если я правильно оцениваю ситуацию, но оказывается, что это проблема.
Демонстрация проблемы
В демонстрации ниже будет 1 скрипт, который загружает модуль, который, в свою очередь, загружает другой модуль.
Каждый модуль имеет код инициализации, который запускается при загрузке модуля.
- Обновление : обновлен код, чтобы немного лучше продемонстрировать, почему он структурирован таким, какой он есть, хотя ответ уже был принят.
module.level2.psm1
# module.level2.psm1
# list of modules loaded by template code
$script:LoadModule = $null
# module housekeeping code - called from template code
function ModuleSpecificInitCode {
Write-Host "Level 2 Code"
}
function Level2ModuleFunction {
Write-Host "This is why I imported Level 2 module"
}
# module housekeeping code - template code
function TemplateInitCode {
Write-Host "Level 2 Init"
$LoadModule | % { Import-Module ".\$_.psm1" }
}
TemplateInitCode
try {
ModuleSpecificInitCode
} catch {
# Error handling
}
module.level1.psm1
# module.level1.psm1
# list of modules loaded by template code
$script:LoadModule = "module.level2"
# module housekeeping code - called from template code
function ModuleSpecificInitCode {
Write-Host "Level 1 Code"
}
function Level1ModuleFunction {
Write-Host "This is why I imported Level 1 module"
}
# module housekeeping code - template code
function TemplateInitCode {
Write-Host "Level 1 Init"
$LoadModule | % { Import-Module ".\$_.psm1" }
}
TemplateInitCode
try {
ModuleSpecificInitCode
} catch {
# Error handling
}
Test.ps1
# test.ps1
Remove-Module module.level*
Import-Module .\module.level1.psm1
При запуске test.ps1 вывод, который я получаю:
PS>.\test.ps1
Level 1 Init
Level 2 Init
Level 2 Code
Level 2 Code
Вопрос / Мой вопрос
Проблема в последней строке . Код уровня 2 работает вместо кода уровня 1.
Я пробовал local
, private
и script
как <scope>:
, но что бы я ни делал, Level 1 Code
никогда не запускается.
Чего мне здесь не хватает, почему все модули работают в одном и том же пространстве имен?