src/public/Invoke-BuildModule.ps1

function Invoke-BuildModule {
    [CmdletBinding()]
    param(
        [string]
        $ModulePath,
        [int]
        $ModuleFileTemplate
    )
    
    begin {
        if ( -not $PSBoundParameters.ContainsKey('ModulePath') ) {
            $ModulePath = (Get-Location).Path
        }
    
        if ( (Get-Location).Path -ne (Resolve-Path $ModulePath) ) {
            Set-Location $ModulePath
        }
    
        $nugetOutputDir = Join-Path $ModulePath "nuget"
        $settingsPath = Join-Path $ModulePath "module.json"
        
        if ( -not ( Test-Path $settingsPath ) ) {
            Write-Error "Settings file cannot be found in path: '$settingsPath'"
        }
    
        $exePattern = '.exe'
        $nugetPath = Get-NuGetExePath
    }
        
    process {
        $settings = Get-Content $settingsPath | Out-String | ConvertFrom-Json
    
        if ( $settings.Packages.PSObject.Properties.Count -gt 0 ) {
            New-Item -Name ".\packages" -ItemType Directory -ErrorAction SilentlyContinue
            Invoke-GeneratePackagesConfig -OutputPath $ModulePath -Packages $settings.Packages
            
            Invoke-Expression "$nugetPath install -OutputDirectory $nugetOutputDir"
        
            $nugetPackages = $settings.Packages.PSObject.Properties | 
                ForEach-Object { $_.Name + '.' + $_.Value }
            
            Set-Location $nugetOutputDir
        
            [string[]] $requiredAssemblies = @()
        
            foreach ( $nugetPackageDir in $nugetPackages ) {
                $assemblies = Invoke-ExtractPackageFiles ( Join-Path (Get-Location).Path $nugetPackageDir )
                $assemblies | ForEach-Object {
                    if ( -not ( $_ -match $exePattern ) ) {
                        $requiredAssemblies += "packages\$_" 
                    }
                }
                $assemblyPaths = $assemblies | ForEach-Object { $_.FullName }
                
                foreach ($path in $assemblyPaths) {
                    Copy-Item $path ..\packages
                }
            }

            Set-Location ..
            Remove-Item -LiteralPath $nugetOutputDir -Force -Recurse
            Remove-Item -LiteralPath "$ModulePath\packages.config" -Force
        }

        $parameters = @{}
        if ( $settings.ModuleArguments ) {
            $settings.ModuleArguments.PSObject.Properties | 
                ForEach-Object { $parameters[$_.Name] = $_.Value }
        }

        $additionalCommands = ''
        if ( $settings.AdditionalCommands ) {
            $additionalCommands = $settings.AdditionalCommands -join [System.Environment]::NewLine
        }
    
        Invoke-GenerateModuleFile `
            -templateOption $ModuleFileTemplate `
            -requiredModules $settings.RequiredModules `
            -parameters $parameters `
            -additionalCommands $additionalCommands `
            -outputPath "$ModulePath\$($settings.Name).psm1"
    
        New-ModuleManifest `
            -Path ".\$($settings.Name).psd1" `
            -RootModule ".\$($settings.Name).psm1" `
            -ModuleVersion ( New-Object System.Version($settings.Version) ) `
            -Guid $settings.Guid `
            -Author $settings.Author `
            -CompanyName $settings.CompanyName `
            -Copyright $settings.Copyright `
            -PowerShellVersion ( New-Object System.Version( $settings.PSVersion ) ) `
            -Description $settings.Description `
            -RequiredAssemblies $requiredAssemblies `
            -DefaultCommandPrefix $settings.DefaultCommandPrefix
    }
}