【问题标题】:How to expose sub module function, from a module如何从模块中公开子模块功能
【发布时间】:2019-07-24 11:22:16
【问题描述】:

如何从一个模块、一个子模块公开一个函数和一个别名

profile.ps1:

Import-Module module_one.psm1

module_one.psm1:

Import-Module module_two.psm1:

module_two.psm1:

Set-Alias readme -Value "Read-Me"
function Read-Me() {
    Write-Host "Hello..."
}
Export-ModuleMember -Function Read-Me, readme

我希望能够从 pwsh 终端、函数名或别名调用此函数吗?

我知道(readmeRead-Me):

自述文件:术语“自述文件”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序。检查名字的拼写, 或者如果包含路径,请验证路径是否正确并重试。 在行:1 字符:1 + 合作 + ~~ + CategoryInfo : ObjectNotFound: (co:String) [], CommandNotFoundException +fullyQualifiedErrorId:CommandNotFoundException

注意:它适用于module_one.psm1中的函数。

【问题讨论】:

  • Import-Module 命令上使用-Global 参数?
  • 谢谢,完全适用于函数。你知道吗,我应该只在 module_one.psm1 级别保留别名吗?

标签: powershell


【解决方案1】:

假设您在同一作用域域(模块外部或来自同一(其他)模块)中调用 Import-Module module_one.psm1 和稍后的 readme / Read-Me,您的代码原则上可以工作:

间接导入模块的导出元素(也)被导入到调用者作用域的顶级作用域中。

您的问题是您试图将 alias readme 导出为 函数;您需要改用单独的
-Alias 参数

Export-ModuleMember -Function Read-Me -Alias readme # Note the -Alias parameter

另请注意,在Export-ModuleMember 调用的缺席中,它是所有(顶级)函数和别名(但不是变量) 是默认导出的,因此在您的特定情况下,只需省略调用也可以解决问题。

不过,一般而言,最好明确说明导出的元素,最好通过一个完整的模块来完成,该模块不仅仅是一个 *.psm1 文件,而是为模块命名的整个目录,包含*.psm1 文件和关联的模块清单,这是一个描述模块的*.psd1 文件,特别是在术语方面其出口。
如果这样的模块放置在$env:PSModulePath 中列出的目录之一中,则可以在导入模块之前发现其导出的命令(例如,使用Get-Command 或tab-completion),通过名为auto 的功能-加载 - 见about_Modules


注意 Import-Module -Global 很少需要并且通常应该避免,因为它使模块的导出元素也可用于所有加载的模块,这可能会产生意想不到的副作用(模块应该声明它们的依赖项明确)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2019-07-16
    • 2019-05-27
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多