Creating powershell modules from multiple files, referencing with module

后端 未结 3 678
轻奢々
轻奢々 2021-02-19 16:04

I creating a PowerShell script module using separate source files. What is the canonical way to reference source functions internal to the module from other internal source fil

3条回答
  •  耶瑟儿~
    2021-02-19 16:25

    Since I recently had to do this myself, I am sharing my solution. I have recently started grouping functions in psm1 files. These can be compiled into a single module with a single manifest.

    This allows me to have groups of functions that can be packaged with multiple modules.

    Write-BarFunctions.psm1

    Function Write-Bar {
      return "Bar"
    }
    
    Function Write-Baz {
        return "Baz"
    }
    

    Write-FooFunctions.psm1

    Function Write-Foo {
        return "Foo"
    }
    
    Function Write-FooBar {
        $foo = Write-Foo
        $bar = Write-Bar
        return ("{0}{1}" -f $foo, $bar)
    }
    
    Function Write-FooBarBaz {
        $foobar = Write-FooBar
        $baz = Write-Baz
        return ("{0}{1}" -f $foobar, $baz)
    }
    

    Which are combined into a single module like this: (formatted for readability)

    New-ModuleManifest 
        -Path .\Write-FooBarBazCombos 
        -NestedModules @('.\FooFunctions\Write-FooFunctions.psm1', '.\BarFunctions\Write-BarFunctions.psm1') 
        -Guid (New-Guid) 
        -ModuleVersion '1.0.0.0' 
        -Description 'demonstrate multiple psm1 files as 1 powershell module with 1 powershell module manifest' 
        -PowerShellVersion $PSVersionTable.PSVersion.ToString() 
        -FunctionsToExport @('Write-Foo', 'Write-Bar','Write-FooBar', 'Write-FooBarBaz')
    
    
    

    PowerShell output:

    PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> New-ModuleManifest -Path .\Write-FooBarBazCombos.psd1
    -NestedModules @('.\Write-FooFunctions.psm1', '.\Write-BarFunctions.psm1') -Guid (New-Guid) -ModuleVersion '1.0.0.0' -D
    escription 'demonstrate multiple psm1 files as 1 powershell module with 1 powershell module manifest' -PowerShellVersio
    n $PSVersionTable.PSVersion.ToString() -FunctionsToExport @('Write-Foo', 'Write-Bar','Write-FooBar', 'Write-FooBarBaz')
    
    PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Import-Module .\Write-FooBarBazCombos.psd1
    PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Get-Command -Module Write-FooBarBazCombos
    
    CommandType     Name                                               Version    Source
    -----------     ----                                               -------    ------
    Function        Write-Bar                                          1.0.0.0    Write-FooBarBazCombos
    Function        Write-Foo                                          1.0.0.0    Write-FooBarBazCombos
    Function        Write-FooBar                                       1.0.0.0    Write-FooBarBazCombos
    Function        Write-FooBarBaz                                    1.0.0.0    Write-FooBarBazCombos
    
    • note that Write-Baz is not exposed in the imported module as it is excluded from the FunctionsToExport parameter so Write-FooBarBaz will error (intentional to show behavior).
    PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Write-FooBar
    FooBar
    

    What you're left with in the directory:

    PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Get-ChildItem | Select-Object Name
    
    Name
    ----
    Write-BarFunctions.psm1
    Write-FooBarBazCombos.psd1
    Write-FooFunctions.psm1
    

    Addendum - I expanded on this answer in another question - here:

    https://stackoverflow.com/a/56171985/7710456

提交回复
热议问题