PowerShell模块,从另一个NestedModule调用NestedModule中的函数

Cat*_*hal 5 powershell

我有一个 Powershell 模块,在清单中我声明了主模块和两个嵌套模块。模块结构如下:

- [dir] Pivot.DockerAdmin
    - [manifest] Pivot.DockerAdmin.psd1
    - [main module file] Pivot.DockerAdmin.psm1
    - [nested script] DockerfileScripts.ps1
    - [nested script] DockerCliScripts.ps1
Run Code Online (Sandbox Code Playgroud)

工作 原理 主模块 (Pivot.DockerAdmin.psm1) 可以毫无问题地调用嵌套模块文件(DockerfileScripts.ps1、DockerCliScripts.ps1)中的函数。请注意,除了清单文件中的条目之外,没有包含这些文件的特定逻辑。

不起作用 一个嵌套模块脚本文件 (DockerfileScripts.ps1) 无法调用其他嵌套模块脚本文件 (DockerCliScripts.ps1) 中的函数。

嵌套模块只是简单的脚本文件。因此,实际上,我使用 NestedModule 概念对其他文件中的某些函数进行逻辑分组。

模块设置正确。我对此很有信心,因为我什至在没有任何特殊处理的情况下在构建箱上运行了 Pester 测试。

我希望能够从另一个嵌套模块调用嵌套模块中的函数,就像主模块可以调用任何嵌套模块中的函数一样,但这会因无法识别的命令错误而失败。

如果这是不可能的,是否有关于在 PS 模块内组织脚本文件的任何建议,以便可以进行类似的脚本划分/关注点分离?

Rya*_*yan 4

因此,如果您看一下我在这里发布的示例:

/sf/answers/3854549681/

我将对此进行一些扩展。

我又看了一遍,并为所有模块创建了一个模块清单,所有这些模块都需要遵循 PowerShell 模块的标准(位于与 PowerShell 模块同名的文件夹中,位于PS模块路径)

写入BazFunctions.psm1:

Function Write-Baz {
    return "Baz"
}
Run Code Online (Sandbox Code Playgroud)

写BarFunctions.psm1:

Function Write-Bar {
    return "Bar"
}

Function Write-BarBaz {
    $bar = Write-Bar;
    $baz = Write-Baz;
    return ("{0}{1}" -f $bar, $baz)
}
Run Code Online (Sandbox Code Playgroud)

写入-FooFunctions.psm1

Function Write-Foo {
    return "Foo"
}

Function Write-FooBar {
    $foo = Write-Foo
    $bar = Write-Bar
    return ("{0}{1}" -f $foo, $bar)
}

Function Write-FooBarBaz {
    $foobar = Write-FooBar
    $baz = Write-Baz
    return ("{0}{1}" -f $foobar, $baz)
}

Function Write-FooBazBar {
    $foo = Write-Foo
    $bar = Write-Bar
    $baz = Write-Baz
    return ("{0}{1}{2}" -f $foo, $bar, $baz)
}
Run Code Online (Sandbox Code Playgroud)

现在-差异。在 Write-BarFunctions 的清单中(注意是必需的,不是嵌套的):

RequiredModules = @('Write-BazFunctions')
Run Code Online (Sandbox Code Playgroud)

请注意与上面链接的原始答案的另一个区别,我直接针对 psm1 文件,而是仅通过模块名称引用它们。

完成此操作后,我就能够导入 Write-FooFunctions 并且所有函数都可用。由于 Write-BarFunctions 中的 Write-BarBaz 从 Write-BazFunctions 调用 Write-Baz,您可以看到这将允许嵌套模块相互引用。