You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:46:07