【问题标题】:Internal functions in PowerShell ModulePowerShell 模块中的内部函数
【发布时间】:2016-01-24 17:08:57
【问题描述】:

我正在编写一个模块,并且我有一些我不想公开的辅助函数,但我确实希望在内部可用于模块函数。我已经设置了我的目录结构,例如:

root\
..Private
....Invoke-PrivateTest.ps1
....private.psd1
....private.psm1
..Public
....Get-Something.ps1
....Public.psd1
....Public.psm1
..test.psd1

我在 github https://github.com/jpbruckler/test 上设置了一个存储库,其中包含所有模块文件。

我期望的行为是 Get-Something 是一个公共函数。当运行Get-Command -Module Test 时,它应该被列出。相反,Invoke-PrivateTest 不应出现在该命令的输出中。

当调用Get-Something 时,它应该输出文本Invoke-PrivateTest called。相反,我收到一条错误消息,指出命令 Invoke-PrivateTest 不存在。

我在test.psd1 中明确表示,只有Get-Something 函数将被导出。

通过test.psd1 中的NestedModules 属性调用私有模块和公共模块。任何帮助或指点将不胜感激。

【问题讨论】:

  • 嵌套模块相互独立。如果你想从Public使用Private,那么Public应该导入Private
  • 我不知道。我一定没有在正确的地方寻找模块文档。这给了我一些关于如何完成的想法。

标签: powershell module


【解决方案1】:

除非您有其他理由将代码放入单独的(子)模块中,否则我会将其保存在一个文件夹中并控制通过函数名称导出的内容。使用“官方”符号(<Verb>-<Noun>)作为公共函数的名称,并省略私有函数名称中的连字符(<Verb><Noun>)。这样您就可以像这样在全局 .psd1 中导出公共函数:

FunctionsToExport = '*-*'

【讨论】:

  • 我不使用这种方法的主要原因是因为非标准名称不是最佳实践,并且可能导致一堆丑陋的警告文本输出到控制台。
【解决方案2】:

@PetSerAl 为我指明了正确的方向。最终,这归结为一个范围界定问题。我安排模块的方式是,每个子模块都需要调用来加载私有模块,这是一堆代码重复——也是我希望通过拆分一些辅助函数来避免的。

为了让它全部工作,而不是多个子模块,我只是将 Public 文件夹分解为子文件夹,这些文件夹将包含执行类似操作的脚本,基本上从 @ 中删除所有 .psd1 和 .psm1 文件987654323@ 目录。我对Private 目录做了同样的事情。这给我留下了一堆松散的 .ps1 文件,我使用以下代码在 test.psm1 中加载:

$Private = (Get-ChildItem -Path (Join-Path $PSScriptRoot 'Private') -Filter *.ps1)
$Public = (Get-ChildItem -Path (Join-Path $PSScriptRoot 'Public') -Filter *.ps1 -Recurse)


foreach ($Script in $Public) {
    . $Script.FullName
    Export-ModuleMember $Script.BaseName
}

foreach ($Script in $Private) {
    . $Script.FullName
}

我在https://github.com/jpbruckler/test 修改了测试模块以反映我所做的更改。

【讨论】:

  • 我认为这个解决方案可能非常有用。链接的 GitHub 存储库不可用。您能否在 GitHub 上提供代码或编辑此答案以包含更多源代码?工作示例是黄金。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 2019-12-12
  • 2016-06-19
  • 2012-07-07
  • 2014-01-24
  • 2016-12-15
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多