我最近参与了一个我们必须使用 powershell 脚本部署的项目。我们在不同的文件中或多或少地编写了 2000 行代码。其中一些致力于通用方法,但是在为每个方法编写了 500 行代码之后,很难找到要使用的方法,或者是否有必要实现一个新方法。
所以,我的问题是关于实现 powershell 函数库的最佳方法是什么:
拥有一些包含大量代码的文件比拥有大量包含几行代码的文件更好吗?
我最近参与了一个我们必须使用 powershell 脚本部署的项目。我们在不同的文件中或多或少地编写了 2000 行代码。其中一些致力于通用方法,但是在为每个方法编写了 500 行代码之后,很难找到要使用的方法,或者是否有必要实现一个新方法。
所以,我的问题是关于实现 powershell 函数库的最佳方法是什么:
拥有一些包含大量代码的文件比拥有大量包含几行代码的文件更好吗?
@MikeShepard 的答案在概念上是可行的。以下是一些与之相关的实现想法:
我有多种语言的开源库。正如 Mike Shepard 所建议的,我的PowerShell API从将顶层组织成不同的主题开始。
对于那些具有多个功能的主题(模块)(例如SvnSupport),每个公共功能都位于一个单独的文件中,其中包含其私有的支持功能和变量,从而增加了凝聚力并减少了耦合。
要将主题(模块)中的函数集合包装在一起,您可以单独枚举它们(通过点源或包括在清单中,如@Thomas Lee 建议的那样)。但我更喜欢从 Scott Muc 那里学到的技术。使用以下代码作为 .psm1 文件的全部内容,并将每个其他函数放在同一目录中的单独 .ps1 文件中。
Resolve-Path $PSScriptRoot\*.ps1 |
? { -not ($_.ProviderPath.Contains(".Tests.")) } |
% { . $_.ProviderPath }
实际上,关于函数和模块还有很多话要说。感兴趣的读者可能会发现我在 Simple-Talk.com 上发表的文章进一步深入兔子洞:PowerShell 模块和封装是一个有用的起点。
您可以创建一个模块,您可以在其中存储专用于常见作业的所有脚本。
我同意@Christian 的建议并使用模块。
您可能会使用的一种策略是将模块分解为多个脚本并将它们全部包含在最终模块中。您可以在 .PSM1 文件中明确点源它们,也可以在清单(.PSD1 文件)中指定文件。
我倾向于根据主题(松散地,名词)拥有多个模块。例如,如果我有一堆处理 MongoDB 的函数,我就会有一个 MongoDB 模块。如果我需要它们,这使得将它们拉入会话变得很容易,但不会因为一堆我很少使用的功能而使每个会话变得混乱。一致的命名约定将很容易知道要导入什么。例如,modMongoDB.psm1 是一个容易记住的名称。
附带说明一下,在 3.0 中,模块加载可以配置为自动,因此无需在您的配置文件中预加载一堆模块。