【问题标题】:How do you create namespaced or sub-modules in PowerShell?如何在 PowerShell 中创建命名空间或子模块?
【发布时间】:2021-04-06 16:28:29
【问题描述】:

我熟悉使用以下文件夹结构编写自定义 PowerShell 模块:

Modules
|  +-- WebUtils
|  |  +-- WebUtils.psm1
|  +-- BuildUtils
|  |  +-- BuildUtils.psm1

您可以通过执行using module WebUtils 之类的操作来导入 webutils 模块。

我有一个正在进行的大型项目,它重用了许多相同的功能。现在我在一个模块中有一百个左右松散相关的功能。问题是我通常只需要使用其中的 10 - 20 个,具体取决于项目。我想以类似的方式拆分模块:

Modules
|  +-- Utils
|  |  +-- Web
|  |  |  +-- Web.psm1
|  |  +-- Build
|  |  |  +-- Build.psm1
|  |  +-- Utils.psm1

我可以像 using module Utils.Web 或类似的名字称呼他们。

我该怎么做呢?我还没有找到任何好的例子。这是组织事物的好方法吗?

【问题讨论】:

    标签: powershell project-structure powershell-module


    【解决方案1】:

    大型模块通常会拆分成单独的模块,这些模块执行一组相关的功能。这个 Azure 的一个很好的例子或 - 如下 - VMware PowerCLI

    如果你Import-Module VMware.PowerCLI 它将导入所有模块。但是您可以导入单个模块,它只会通过在 .psd1 中命名的那些函数/命令和任何模块依赖项导入,例如,如果您只想要 VMware.VimAutomation.Core 它也引入了 VMware.VimAutomation.Cis.Core

    所以不,不是一个模块的子文件夹,而是可以加载的其他相关模块。

    【讨论】:

    • 所以看起来像命名空间的名称在功能上真的没有意义吗?就像在 VMware.Vim 中一样,可以简单地命名为“VimSomething”,它会以同样的方式工作吗?并且导入 VMware 不会导入 VMware.* 模块,您需要创建一个单独的模块,将 child 模块导入 .psd1 或其他什么?
    • 是的 - 模块父级是 VMware.PowerCLI - 实际上是您安装的 - Install-Module VMware.PowerCLI 将安装所有这些模块。大多数人也使用Import-Module VMware.PowerCLI,但是这 - 与您的用例一样 - 也导入了许多很少使用的功能/命令,因此可以在需要时单独导入每个子模块,从而节省导入时间和内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2020-07-14
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多