#脚本模块与打包
#简介
模块是 PowerShell 分发和复用代码的基本单位。脚本模块使用 .psm1 文件保存 PowerShell 代码,配合 .psd1 清单描述元数据、导出成员和依赖关系。规范的模块结构便于测试、发布和版本管理。
#创建 .psm1 文件
# MyModule.psm1
function Get-Greeting {
param([string]$Name = 'World')
"Hello, $Name"
}
function Get-InternalValue {
42
}
Export-ModuleMember -Function Get-Greeting
Export-ModuleMember 决定模块向外暴露哪些成员。上面的模块只导出 Get-Greeting,Get-InternalValue 仅在模块内部可用。如果没有调用 Export-ModuleMember,脚本模块默认导出所有函数。
Export-ModuleMember 也支持 -Alias 和 -Variable 参数,用于导出别名和变量。
#创建模块清单
使用 New-ModuleManifest 生成 .psd1 清单:
New-ModuleManifest -Path ./MyModule/MyModule.psd1 `
-RootModule 'MyModule.psm1' `
-ModuleVersion '1.0.0' `
-GUID ([guid]::NewGuid()) `
-Author 'Your Name' `
-Description '示例脚本模块' `
-FunctionsToExport @('Get-Greeting') `
-PowerShellVersion '7.0'
生成的清单包含大量字段,发布前应逐项检查。常用字段包括 RootModule、ModuleVersion、GUID、Author、Description、FunctionsToExport、PowerShellVersion 和 RequiredModules。其中 GUID 是模块唯一标识,发布后不要更改。
#模块目录结构
推荐的模块结构如下:
MyModule/
├── MyModule.psd1
├── MyModule.psm1
├── Public/
│ └── Get-Greeting.ps1
└── Private/
└── Helper.ps1
MyModule.psm1 可以逐个点源加载 Public 和 Private 中的脚本,再统一导出公共函数。模块目录放入 $env:PSModulePath 包含的路径后,可以通过名称自动发现。
#导入和检查
Import-Module ./MyModule/MyModule.psd1 -Force
Get-Command -Module MyModule
Test-ModuleManifest ./MyModule/MyModule.psd1
#版本号
ModuleVersion 使用 .NET 的版本格式,常见写法是 主版本.次版本.修订号,例如 1.2.0。建议遵循语义化版本:
- 主版本:不兼容的 API 变更。
- 次版本:向后兼容的功能新增。
- 修订号:向后兼容的问题修复。
预发布版本放在私有数据中,而不是写在 ModuleVersion 里:
@{
ModuleVersion = '1.2.0'
PrivateData = @{
PSData = @{
Prerelease = 'beta1'
Tags = @('demo', 'tools')
}
}
}
#注意事项
- 清单中的
GUID在首次发布后不应更改。 FunctionsToExport建议显式列出,避免内部函数意外暴露。- 模块目录名通常与清单文件名、模块名保持一致。
- 发布后同一版本号不能重复使用,更新代码前先提升版本号。