2014-03-05 56 views
5

我正在構建一個模塊,用於導出我想通過我的配置文件提供的cmdlet。此cmdlet的實現分佈在多個實現文件中,這些實現文件包含我不想公開的實現函數。所以我使用Export-ModuleMember來隱藏它們。Powershell模塊設計 - 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命令時,我必須在我的實現文件中導入一個模塊,每次我需要一個函數在裏面。例如,假設我有一個帶有函數Get-Person的person.psm模塊,我需要在所有實現文件中調用它。現在我必須在每個需要調用Get-Person的文件中導入person.psm1。這是使用Export-ModuleMember -Function Get-Something的結果。沒有它,我只需要導入person.psm1一次,它就可以使用。

實際上,Export-ModuleMember不僅阻止了我的實現,還阻止了我的實現。

這是預期的並且被認爲是設計Powershell模塊的一個正常方面嗎?

回答

15

在模塊開發過程中,這其實有點爭議。最初,Export-ModuleMember被要求導出任何函數。這變得乏味和限制。因此,默認情況下,只要您從未在.PSM1中使用過Export-ModuleMember,模塊中的所有函數都是可見的,但變量和別名不可見。

如果使用Export-ModuleMember,它將開始限制該列表。導出較少數量的函數可能並不是一個壞主意,但您必須謹慎使用它。

你可以寫:

Export-ModuleMember -Function a,b,c 

其中出口的一些功能。

Export-ModuleMember -Function * 

後者相當於完全省略導出-ModuleMember。

如果你願意,你可以使用更多限制性的通配符,但是我發現99%的時間,你根本不需要打擾它。

您似乎要問的另一件事是如何最好地處理模塊依賴關係。現在,在編寫腳本時導入一個或兩個模塊相當常見,就像在C#項目中包含一個或兩個程序集相當常見一樣。如果你在模塊內部執行此操作,可以在Import-Module上使用-Global標誌,並避免使用-Force(它將重新加載模塊)。這使得在不同的功能中重複使用模塊更有效率。這也使得它不太可能出現模塊「循環」(卸載和重新加載)的問題,不幸的是,許多模塊不能很好地工作。

在每個函數中引用模塊的替代方法是使用模塊清單(Get-Help New-ModuleManifest)。模塊清單非常有趣,並且需要學習模塊開發的許多部分。如果在模塊清單的RequiredModules列表中包含模塊,它將在模塊導入之前自動加載(至少在PowerShell 3和更高版本中)。如果在模塊清單的NestedModules列表中包含模塊,則它將作爲模塊的一部分加載,而由模塊導出的命令將由模塊導出。

模塊設計是一個棘手的野獸,但它是非常有益的做對。祝你好運。