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

7

我有一大批powershell代码,是在一个长期项目中编写的;这些脚本执行各种功能,其中大多数都以某种方式依赖于项目范围内的其他脚本。目前,这项工作由几个包含许多函数的文件组成。最初,为了使用这些脚本,所有脚本文件都被随意地点源到环境中。

然而,我最近了解到Powershell 2.0引入了模块,我希望以这种方式部署这些脚本。由于模块的内容都一起加载,我想将我的文件拆分开来,使每个脚本都有自己的文件,以帮助源代码控制。但是,我对脚本之间的连接还有点不清楚。

我做了一些测试,似乎将每个函数的Export-ModuleMember命令移到单独的.ps1文件中是可以的;这更像是函数声明它们自己的作用域,就像C#中的公共和私有作用域。然而,在这样做之后,我的.psm1文件除了这个之外什么都没有:

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

这样做对吗?所有脚本都在使用点号源的情况下相互引用。它们是否应该改为使用相对于$psScriptRoot的位置来相互引用?

除了这两种方法,还有其他方法吗?有人可以提供建议吗?我对这些不是很了解。

2个回答

7

我曾见过一种类似的技术,其中每个 .ps1 文件都包含一个函数,并且这些函数在 WPK 模块和 PSRemoteRegistry 模块中使用的 PSM1 文件中被引用。

下面这行是 PSRemoteRegistry 模块:

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

我认为分离函数方案胜过于使用一个巨大的脚本文件。

1
我有点这样做,但我将几个类似的函数分组到一个脚本中,而不是每个函数都在自己的文件中。 - JasonMArcher

4

您可以考虑创建一个清单文件(我不确定是否需要使用psm1和psd1)。

这是我使用清单文件的方式:

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参数中包含文件列表。

我在这里写了一些调研结果(包括指向微软资源的链接):

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


问题在于,这仍然没有导出命令,以便 get-command -module Fiddler 将显示此模块提供的命令。 - Josiah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接