5

我有很多我爲長期項目編寫的powershell代碼;這些腳本執行各種各樣的功能,其中大部分功能都以某種方式依賴於項目範圍內的其他功能。目前,這個工作是由幾個包含許多函數的文件組成的。最初,爲了處理這些腳本,所有的腳本文件都是隨便點入環境中的。如何管理多文件Powershell模塊中腳本之間的依賴關係?

但是,我最近了解到Powershell 2.0引入了模塊,我想以這種方式部署這些腳本。由於模塊的內容全部加載在一起,我想分割我的文件,以便每個腳本都有自己的文件,以幫助源代碼管理。不過,我現在對腳本之間的關係有點不清楚。

我已經做了一些測試,並且似乎可以將每個函數的Export-ModuleMember命令移動到單個.ps1文件;這看起來更像是聲明他們自己的作用域的函數,如C#中的公共和私有範圍。但是,在這樣做之後,我的.psm1文件除此之外不包含任何內容:

Get-ChildItem -recurse $psScriptRoot | where { $_.Extension -eq ".ps1" } | foreach { . $_.FullName } 

這看起來是否正確?所有的腳本都是源代碼的,所有的腳本都是在這個假設下互相引用的。他們應該使用相對於$ psScriptRoot的位置來引用對方嗎?

這兩種方式有什麼不同嗎?任何人都可以提供意見我還不太瞭解這些。

回答

6

我見過類似的技術,其中每個.ps1文件包含一個函數,並且函數來源於WPK模塊和PSRemoteRegistry模塊中使用的PSM1文件。

此行是PSRemoteRegistry模塊:

Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName } 

,我會說我喜歡在具有的功能的一個巨大的腳本文件的技術。

+1

我有點做到這一點,但我將幾個類似功能於一體的腳本,而不是各自在自己的文件。 – JasonMArcher 2011-06-18 18:04:43

4

你也可以看看創建一個清單(我實際上不知道你是否需要一個psd1 psm1)。

這裏是我使用清單的:

New-ModuleManifest ` 
    -Path Fiddler.psd1 ` 
    -Author "Niklas Goude" ` 
    -CompanyName "http://www.powershell.nu/" ` 
    -ModuleVersion 1.0 ` 
    -Description "Module from http://www.powershell.nu/2011/03/14/fiddler/</a> - psd1 created by Matt @ amonskeysden.tumblr.com" ` 
    -FormatsToProcess @() ` 
    -RequiredAssemblies @("Fiddler.dll") ` 
    -NestedModules @() ` 
    -Copyright "" ` 
    -ModuleToProcess "Fiddler.psm1" ` 
    -TypesToProcess @() ` 
    -FileList @("Fiddler.psm1","Fiddler.dll") 

我想回答你的問題應該包含在文件列表中的參數有你的文件列表。

我寫了一些我的調查結果(包括鏈接到MS資源)的位置:

http://amonkeysden.tumblr.com/post/5127684898/powershell-and-fiddler

+0

問題是,這仍然不會導出命令,以便get-command -module Fiddler將顯示此模塊可用的命令。 – flickerfly 2012-09-12 19:19:12