模块 ScriptToProcess:是否可以抢先将函数加载到模块范围内?
Module ScriptToProcess: Is it possible to load functions into module scope preemptively?
我最近在模块清单中发现了 ScriptsToProcess 成员,并试图探索使用它来简化模块中下标的组织。我认为重用我现有的清单文件来加载 ScriptsToProcess 成员中的下标,而不是使用单独的模块下标来加载我所有的下标。
它似乎适用于我的枚举——至少,我认为是这样。但是我的功能无法正常工作,而且我还没有将模块 运行 推到它试图实例化其中一个 类.
的位置
示例:
PS>New-Item -Path test/test.psm1 -Force
PS>cd test
test.psm1
Function testModule {
callEcho
}
Export-ModuleMember -Function testModule
test.psd1
PS>New-ModuleManifest -Path .\test.psd1 -RootModule .\test.psm1 -ScriptsToProcess .\subscripts\functions.ps1
PS>New-Item -Path subscripts/functions.ps1 -Force
函数。ps1
Function writeEcho {
write-host 'it worked!'
}
Write-Host 'ScriptsToProcess has loaded me'
PS>Import-Module .\test.psd1 -Force
PS>testModule
callEcho : The term 'callEcho' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
我的模块无法访问该功能。
我认为这是有意为之的,那么有没有其他方法可以解决这个问题,或者我是否需要制作一个单独的文件,在模块的开头以点作为我所有下标的来源?
此外,此行为是否也适用于 类?
PS5.1.14393
ScriptsToProcess
脚本在 进口商的 范围内是点源的,除非该范围恰好是 global 范围,[1] 您的模块将看不到定义。
要在 您的模块 的上下文中使用点源帮助程序脚本,请将它们放在名为 scripts
的子目录中,然后将以下代码放在您的RootModule
.psm1
文件:
Get-ChildItem $PSScriptRoot/scripts -Filter *.ps1 |
ForEach-Object { . $_.FullName }
请注意,除非您明确导出这些脚本中定义的函数,否则它们将仅在模块内可见。
关于使 enum
和 class
定义可供 进口商 使用:
在您的模块中定义它们并让导入器通过using module
而不是通过Import-Module
.
导入模块
仅使用 ScriptsToProcess
脚本使 enum
和 class
可供导入程序使用 如果您不在模块中也使用它们.
请注意,如果您尝试将同一脚本与 both ScriptsToProcess
and 模块内部点源一起使用,你最终会得到 enum
s 和 class
es 在这两种情况下 不一样 - 即使它们 出现 成为.
[1] 也就是说,当您 运行 Import-Module
直接从交互式 Powershell 提示 (或当您使用等效机制)——重要的是 importer 运行 所在的范围。这与 将模块加载到 的范围无关, 例如 Import-Module -Global
我最近在模块清单中发现了 ScriptsToProcess 成员,并试图探索使用它来简化模块中下标的组织。我认为重用我现有的清单文件来加载 ScriptsToProcess 成员中的下标,而不是使用单独的模块下标来加载我所有的下标。
它似乎适用于我的枚举——至少,我认为是这样。但是我的功能无法正常工作,而且我还没有将模块 运行 推到它试图实例化其中一个 类.
的位置示例:
PS>New-Item -Path test/test.psm1 -Force
PS>cd test
test.psm1
Function testModule {
callEcho
}
Export-ModuleMember -Function testModule
test.psd1
PS>New-ModuleManifest -Path .\test.psd1 -RootModule .\test.psm1 -ScriptsToProcess .\subscripts\functions.ps1
PS>New-Item -Path subscripts/functions.ps1 -Force
函数。ps1
Function writeEcho {
write-host 'it worked!'
}
Write-Host 'ScriptsToProcess has loaded me'
PS>Import-Module .\test.psd1 -Force
PS>testModule
callEcho : The term 'callEcho' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
我的模块无法访问该功能。
我认为这是有意为之的,那么有没有其他方法可以解决这个问题,或者我是否需要制作一个单独的文件,在模块的开头以点作为我所有下标的来源?
此外,此行为是否也适用于 类?
PS5.1.14393
ScriptsToProcess
脚本在 进口商的 范围内是点源的,除非该范围恰好是 global 范围,[1] 您的模块将看不到定义。
要在 您的模块 的上下文中使用点源帮助程序脚本,请将它们放在名为 scripts
的子目录中,然后将以下代码放在您的RootModule
.psm1
文件:
Get-ChildItem $PSScriptRoot/scripts -Filter *.ps1 |
ForEach-Object { . $_.FullName }
请注意,除非您明确导出这些脚本中定义的函数,否则它们将仅在模块内可见。
关于使 enum
和 class
定义可供 进口商 使用:
在您的模块中定义它们并让导入器通过using module
而不是通过Import-Module
.
仅使用 ScriptsToProcess
脚本使 enum
和 class
可供导入程序使用 如果您不在模块中也使用它们.
请注意,如果您尝试将同一脚本与 both ScriptsToProcess
and 模块内部点源一起使用,你最终会得到 enum
s 和 class
es 在这两种情况下 不一样 - 即使它们 出现 成为.
[1] 也就是说,当您 运行 Import-Module
直接从交互式 Powershell 提示 (或当您使用等效机制)——重要的是 importer 运行 所在的范围。这与 将模块加载到 的范围无关, 例如 Import-Module -Global