2016-01-24 29 views
1

我正在编写一个模块,并且我有一些我不想公开的帮助函数,但我希望在内部可以使用模块函数。我已经建立了我的目录结构,如:PowerShell模块中的内部函数

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函数要导出。

Private模块和公共模块都通过test.psd1中的NestedModules属性被调用。任何帮助或指针,将不胜感激。

+0

嵌套模块相互独立。如果你想从'Public'使用'Private',那么'Public'应该导入'Private'。 – PetSerAl

+0

我不知道。我不能在模块文档的正确位置查找。这给了我一些关于如何完成的想法。 –

回答

1

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

把一切工作,而不是多个子模块,我刚分手的Public文件夹复制到子文件将保存脚本,做类似的事情,基本上是从Public目录中删除所有的.psd1和名为.psm1文件。我为Private目录做了同样的事情。这给我留下了一堆,我在test.psm1加载与下面的代码宽松的.ps1文件:

$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,以反映我所做的更改。

+0

我认为这个解决方案可能非常有用。链接的GitHub仓库不可用。你可以让代码在GitHub上可用或者编辑这个答案来包含更多的源代码?工作实例是黄金。谢谢! – user24601

0

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

FunctionsToExport = '*-*' 
+1

我不使用这种方法的主要原因是因为非标准名称不是最佳实践,并可能导致一堆难看的警告文本输出到控制台。 –