I'm building a PowerShell module. It contains several public functions as well as a bunch of private utility functions. I want for the users of the module to know only about the public functions.
I've created Project.psm1.
. "${PSScriptRoot}\public\Foo.ps1"
Export-ModuleMember -Function Foo
Because I intend to publish the module to the PowerShell Gallery, I also need to have a manifest file. I've created a script that will generate a manifest for the project.
New-ModuleManifest `
-Guid 'd1f545c4-49db-4fd8-bc14-53df36387757' `
-Path path\to\project `
-RootModule "Project.psm1" `
-FunctionsToExport 'Foo'
I don't like I need to specify Foo in 2 places. If I rename or delete Foo, or add a new function to export, I will have to change two files and sooner or later I will forget about one of them.
Is there a way to have all the functions to export specified in a single place?
CodePudding user response:
The exports explicitly specified in a module manifest (
.psd1file) additionally constrain the implicit or explicit exports of a script module (.psm1file).Implicitly - in the absence of an
Export-ModuleMembercall - a script module exports all its (a) functions and (b) aliases, but not its variables.
Given that exporting variables from modules is best avoided,[1] there is usually no reason to use Export-ModuleMember in a script module file.
Thus, controlling what functions (and aliases) your module exports need only be maintained in the FunctionsToExport (AliasesToExport) entry of the module manifest.
[1] Not only would exporting variables increase the risk of name collisions, it also presents a discoverability problem; generally, users expect modules only to export commands, which can be discovered with Get-Command and help for which can be requested with Get-Help / -?.
