powershell - 如何从模块中公开子模块功能
问题描述
如何从子模块中公开模块中的函数和别名
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 终端、函数名或别名调用此函数?
我得到(readme
或Read-Me
):
自述文件:术语“自述文件”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序。检查名字的拼写, 或者如果包含路径,请验证路径是否正确并重试。 在行:1 字符:1 + 合作 + ~~ + CategoryInfo : ObjectNotFound: (co:String) [], CommandNotFoundException +fullyQualifiedErrorId:CommandNotFoundException
注意:它适用于module_one.psm1
.
解决方案
假设您在同一个作用域域(模块外部或来自同一(其他)模块)中调用Import-Module module_one.psm1
和稍后readme
/ ,您的代码原则上可以工作:Read-Me
间接导入模块的导出元素(也)被导入调用者作用域的顶级作用域。
您的问题是您正在尝试将别名 readme
导出为函数;您需要改用单独的-Alias
参数:
Export-ModuleMember -Function Read-Me -Alias readme # Note the -Alias parameter
另请注意,在没有Export-ModuleMember
调用的情况下,默认导出的是所有(顶级)函数和别名(但不是变量),因此在您的特定情况下,只需省略调用也可以解决问题。
不过,一般来说,最好明确导出哪些元素,最好通过一个完整的模块来完成,该模块不仅仅是一个文件,而是一个以模块命名*.psm1
的整个目录*.psm1
,文件包含一个关联的模块清单,这是一个*.psd1
描述模块的文件,特别是在它的导出方面。
如果这样的模块被放置在 中列出的目录之一中$env:PSModulePath
,甚至可以在导入模块之前发现其导出的命令(例如,使用Get-Command
或 tab-completion),通过称为自动加载的功能- 请参阅about_Modules。
请注意,这Import-Module -Global
很少需要并且通常应该避免,因为它使模块的导出元素也可用于所有加载的模块,这可能会产生意想不到的副作用(模块应该显式声明它们的依赖项)。
推荐阅读
- python-3.x - 如何为 pd.read_html() 重用请求 content.text
- angular - TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator)) for effects, selectors, services [Angular 11]
- python - python格式化程序(autopep8,粘贴格式)(VSCode)
- c++ - arm-gcc (stm32) 的单例实现
- r - 无法为 barplot 函数制作图例。(在 R 中)
- armadillo - 为什么在多维数据集中分配值时会产生nan?
- ethereum - 如何修复“Truffle Migrate”字节码未定义错误
- iphone - 适用于 iOS 的 Flutter 构建档案无法稳定
- mysql - 当我在 MySQL 中的 select 语句中包含更多列时,输出不同
- javascript - 在threejs中获取相机导航的问题