如何管理多文件Powershell模块中的脚本之间的依赖关系?

时间:2011-06-02 23:04:35

标签: powershell module dependencies multiple-files powershell-module

我有很多我在长期项目中编写的PowerShell代码;这些脚本执行各种各样的功能,并且大多数功能在某种程度上依赖于项目范围内的其他功能。现在,这项工作由几个文件组成,每个文件包含许多功能。最初,为了使用这些脚本,所有脚本文件都是偶然的点源到环境中。

但是,我最近了解到Powershell 2.0引入了模块,我想以这种方式将这些脚本一起部署。由于模块的内容全部加载在一起,我想拆分我的文件,以便每个脚本都有自己的文件,以帮助控制源。但是,我现在对脚本之间的联系还不太清楚。

我已经做了一些测试,似乎可以将每个函数的Export-ModuleMember命令移动到各个.ps1文件;这似乎更像是在C#中声明自己的范围,如公共和私有作用域的函数。但是,在执行此操作后,我的.psm1文件只包含此内容:

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

这看起来是对的吗?所有脚本都是点源的,并且所有脚本在该假设下相互引用。他们应该使用相对于$ psScriptRoot的位置来互相引用吗?

这两种方式有什么不同吗?有人可以提供建议吗?我对这些还不太了解。

2 个答案:

答案 0 :(得分:6)

我见过类似的技术,其中每个.ps1文件包含一个函数,函数源自WPK模块和PSRemoteRegistry模块中使用的PSM1文件。

这一行是PSRemoteRegistry模块:

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

我想说我喜欢有一个巨大的函数脚本文件的技术。

答案 1 :(得分: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")

我认为您的问题的答案是将文件列表包含在FileList参数中。

我在这里写了一些我的发现(包括MS资源的链接):

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