约 2306 字

约 12 分钟

#脚本模块与打包

#简介

模块是 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 建议显式列出,避免内部函数意外暴露。
  • 模块目录名通常与清单文件名、模块名保持一致。
  • 发布后同一版本号不能重复使用,更新代码前先提升版本号。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2