【问题标题】:PowerShell module design - Export-ModuleMemberPowerShell 模块设计 - Export-ModuleMember
【发布时间】:2014-03-05 17:39:58
【问题描述】:

我正在构建一个模块,用于导出我想通过我的个人资料提供的 cmdlet。此 cmdlet 的实现分布在多个实现文件中,这些文件包含我不想公开的实现功能。所以我使用Export-ModuleMember 来隐藏它们。

文件 get_something.psm1

import-module .\get_something_impl.psm1

function Get-Something {
    [cmdletbinding()]
    Get-SomethingImplementation
}

Export-ModuleMember -Function Get-Something

然后我将 get_something.psm1 添加到我的个人资料中。通过仅导出 Get-Something,我的所有实现函数都保持“私有”。

我遇到的问题是,当使用 Export-ModuleMember 命令时,每次我需要其中的一个函数时,我都必须在我的实现文件中导入一个模块。例如,假设我有一个模块 person.psm1,它带有一个函数 Get-Person,我需要在我的所有实现文件中调用它。现在我必须在需要调用 Get-Person 的每个文件中导入 person.psm1。这是使用 Export-ModuleMember-Function Get-Something 的结果。没有它,我只需要导入一次 person.psm1 就可以使用了。

本质上,Export-ModuleMember 不仅阻止了我对外部的实现。它阻止了我自己的实现。

这是设计 PowerShell 模块的预期并被认为是正常的方面吗?

【问题讨论】:

    标签: function powershell powershell-module


    【解决方案1】:

    这实际上是在模块开发过程中的一些争论。最初,导出任何函数都需要Export-ModuleMember。这变得乏味和限制。因此,默认情况下,模块中的所有函数都是可见的,但变量和别名不可见,只要您从未在 .PSM1 中使用过 Export-ModuleMember

    如果您使用Export-ModuleMember,它将开始限制该列表。导出较少数量的函数可能不是一个坏主意,但您必须谨慎使用它。

    你可以写:

    Export-ModuleMember -Function a,b,c
    

    导出一些函数。

    Export-ModuleMember -Function *
    

    后一种相当于完全省略Export-ModuleMember

    如果您愿意,可以使用限制性更强的通配符,但我发现 99% 的情况下,您根本不需要费心。

    您似乎在问的另一件事是如何最好地处理模块依赖关系。如今,在编写脚本时导入一个或两个模块相当普遍,就像在 C# 项目中包含一个或两个程序集相当普遍一样。如果您在模块内部执行此操作,您可以在Import-Module 上使用-Global 标志,并避免使用-Force(这将重新加载模块)。这使得在不同功能中重用模块的效率更高。它还减少了“循环”(卸载和重新加载)模块的问题,不幸的是,许多模块做得不好。

    在每个函数中引用模块的替代方法是使用模块清单 (Get-Help New-ModuleManifest)。模块清单非常有趣,模块开发的许多部分都需要学习。如果您在模块清单的RequiredModules 列表中包含一个模块,它将在导入模块之前自动加载(至少在 PowerShell 3 和更高版本中)。如果您在模块清单的NestedModules 列表中包含一个模块,它将作为模块的一部分加载,而模块导出的命令将由您的模块导出。

    模块设计是一个棘手的问题,但做对了却是非常有益的。祝你好运。

    【讨论】:

    • 您能否详细说明“循环”模块并举例说明模块如何做得不好?为什么Import-Module -Global 是一个神奇的解决方案?我相信以下 GitHub 问题涵盖了“循环”问题(但可能还有更多细微差别):github.com/PowerShell/PowerShell/issues/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多