task/Build/Merge.ps1

BuildTask Merge -Stage Build -Properties @{
    Order          = 4
    Implementation = {
        $mergeItems = 'enumeration', 'class', 'private', 'public', 'InitializeModule.ps1' | ForEach-Object {
            Join-Path $buildInfo.Source $_
        }

        $fileStream = [System.IO.File]::Create($buildInfo.ReleaseRootModule)
        $writer = New-Object System.IO.StreamWriter($fileStream)

        $usingStatements = New-Object System.Collections.Generic.List[String]

        Get-ChildItem $mergeItems -Filter *.ps1 -File -Recurse -ErrorAction SilentlyContinue |
            Where-Object { $_.Extension -eq '.ps1' -and $_.Length -gt 0 } |
            ForEach-Object {
                $functionDefinition = Get-Content $_.FullName | ForEach-Object {
                    if ($_ -match '^using') {
                        $usingStatements.Add($_)
                    } else {
                        $_.TrimEnd()
                    }
                } | Out-String
                $writer.WriteLine($functionDefinition.Trim())
                $writer.WriteLine()
            }

        if (Test-Path 'InitializeModule.ps1') {
            $writer.WriteLine('InitializeModule')
        }

        $writer.Close()

        $rootModule = (Get-Content $buildInfo.ReleaseRootModule -Raw).Trim()
        if ($usingStatements.Count -gt 0) {
            # Add "using" statements to be start of the psm1
            $rootModule = $rootModule.Insert(0, "`r`n`r`n").Insert(
                0,
                (($usingStatements.ToArray() | Sort-Object | Get-Unique) -join "`r`n")
            )
        }
        Set-Content -Path $buildInfo.ReleaseRootModule -Value $rootModule -NoNewline
    }
}