如何避免在PowerShell模块的psd1与psm1中重复声明导出函数?
解决PowerShell模块导出函数重复声明的问题
有几种实用方法可以让你只在一处维护导出的函数列表:
方法一:基于public目录自动同步(推荐)
这种方法利用public目录下脚本文件名与函数名一致的规范,自动发现并导出函数,同时在生成清单时同步获取函数名,无需手动维护列表:
修改Project.psm1:
# 导入public目录下所有脚本 Get-ChildItem -Path "${PSScriptRoot}\public" -Filter *.ps1 | ForEach-Object { . $_.FullName } # 获取所有公共函数名(文件名即函数名) $publicFunctions = (Get-ChildItem -Path "${PSScriptRoot}\public" -Filter *.ps1).BaseName # 导出函数 Export-ModuleMember -Function $publicFunctions
修改清单生成脚本:
# 获取public目录下的函数名 $publicFunctions = (Get-ChildItem -Path "path\to\project\public" -Filter *.ps1).BaseName New-ModuleManifest ` -Guid 'd1f545c4-49db-4fd8-bc14-53df36387757' ` -Path "path\to\project\Project.psd1" ` -RootModule "Project.psm1" ` -FunctionsToExport $publicFunctions
后续新增/删除公共函数时,只需在public目录下添加/移除对应的.ps1文件即可,两处的导出配置会自动同步。
方法二:用单独配置文件统一管理
如果需要手动指定导出函数(而非完全依赖目录结构),可以创建一个单独的配置文件来维护导出列表:
1. 创建配置文件ExportedFunctions.txt
在模块根目录下新建该文件,每行写一个要导出的函数名:
Foo Bar Baz
2. 修改Project.psm1:
# 读取导出函数列表 $exportedFunctions = Get-Content "${PSScriptRoot}\ExportedFunctions.txt" # 导入对应脚本 $exportedFunctions | ForEach-Object { . "${PSScriptRoot}\public\$_.ps1" } # 导出函数 Export-ModuleMember -Function $exportedFunctions
3. 修改清单生成脚本:
# 读取导出函数列表 $exportedFunctions = Get-Content "path\to\project\ExportedFunctions.txt" New-ModuleManifest ` -Guid 'd1f545c4-49db-4fd8-bc14-53df36387757' ` -Path "path\to\project\Project.psd1" ` -RootModule "Project.psm1" ` -FunctionsToExport $exportedFunctions
后续只需修改ExportedFunctions.txt文件,就能同步更新模块的导出配置。
注意事项
- 方法一要求每个公共函数单独放在同名的
.ps1文件中,这是PowerShell模块的最佳实践之一,也便于维护。 - 发布到PowerShell Gallery时,建议使用明确的函数列表(而非通配符),避免意外导出私有函数,以上两种方法都能满足这一要求。
内容的提问来源于stack exchange,提问作者Petru Cervac
相关产品推荐
相关产品推荐

