我们有一个基于脚本的PowerShell模块正在迅速发展。它由.psm1,.psd1和大约35个额外的.ps1文件组成。每个.ps1文件都包含一个cmdlet,以便于管理。 .psm1文件简单点源.ps1文件的内容,如下所示:
. $PSScriptRoot/file1.ps1
# more dot-sourced files
. $PSScriptRoot/file35.ps1
我们已将构建过程配置为自动"发布"该模块通过使用数字证书对所有文件进行签名,并将它们复制到共享网络驱动器。我们的每个用户都将该网络驱动器添加到其PSModulePath环境变量中。总的来说,这非常有效。
但是,随着我们继续添加新文件,模块导入的时间越来越长,特别是在延迟较高的连接上(即通过VPN远程连接时)。虽然我知道我们可以让用户在本地安装新版本的模块,但是更新速度快,我们每个人都可以更轻松地将模块发布到网络驱动器而不必每天将其推送到一堆机器上
我的一个想法是实现一个更高级的构建过程,该过程读取.psm1文件并在线转换点源文件,这样我只有一个大文件。然后我可以签名并发布一个文件,类似于javascript缩小过程的工作方式。这意味着导入模块时往返次数减少,签名验证也减少。在Import-Module调用期间,它似乎可以节省大量时间。
我的问题如下:
答案 0 :(得分:0)
我在构建脚本中使用了以下内容,该模块似乎没有问题。运行一个导入模块,其中串联的.psm1文件是本地的,现在只需不到1秒,而之前为3-4秒。通过网络驱动器,差异应该更大。
# Create a concatenated version of all dot-sourced files
$moduleLoader = Get-ChildItem -Path (Join-Path $ModuleCodeRoot 'MyModule.psm1')
Get-Content $moduleLoader.FullName | ForEach-Object {
if ($_ -match '^\s*[.]\s*\$PSScriptRoot/(.*)') {
Get-Content (Join-Path $moduleLoader.DirectoryName $Matches[1])
} else {
$_
}
} | Set-Content (Join-Path $StagingPath $moduleLoader.Name)