powershell 如何避免在清单文件(*.psd1)和模块文件(*.psm1)中重复导出的函数?

oyjwcjzk  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(173)

我正在构建一个PowerShell模块。它包含一些公共函数和一些私有实用函数。我希望模块的用户只知道公共函数。
我创建了Project.psm1

. "${PSScriptRoot}\public\Foo.ps1"

Export-ModuleMember -Function Foo

因为我打算将模块发布到PowerShell库,所以我还需要一个清单文件。我已经创建了一个脚本,它将为项目生成清单。

New-ModuleManifest `
    -Guid 'd1f545c4-49db-4fd8-bc14-53df36387757' `
    -Path path\to\project `
    -RootModule "Project.psm1" `
    -FunctionsToExport 'Foo'

我不喜欢在两个地方指定Foo,如果我重命名或删除Foo,或者添加一个新的导出函数,我将不得不更改两个文件,最终,我会忘记其中一个。
有没有办法在一个地方指定所有要导出的函数?

qacovj5a

qacovj5a1#

  • module manifest.psd1文件)中显式指定的导出 * 还会约束 * 脚本模块(.psm1文件)的 * 隐式或显式 * 导出。
    • 隐式地 * --在 * 没有 * Export-ModuleMember调用的情况下--脚本模块导出 * 所有 * 它的(a)函数和(b)别名,但 * 不导出 * 它的变量。

假设最好避免从模块中导出 * 变量 *,[1]通常没有理由在脚本模块文件中使用Export-ModuleMember
因此,只需要在模块清单的FunctionsToExportAliasesToExport)条目中维护控制模块导出哪些函数(和别名)。
[1]导出变量不仅会增加名称冲突的风险,还会带来一个“可发现性”问题;通常,用户期望模块仅导出 * 命令 *,可以使用Get-Command发现这些命令,并且可以使用Get-Help/-?请求这些命令的帮助。

相关问题