2016-01-24 71 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

我不使用這種方法的主要原因是因爲非標準名稱不是最佳實踐,並可能導致一堆難看的警告文本輸出到控制檯。 –