Publish-VisualStudioSolution.psm1

<#
.Synopsis
   Publish visual studio solution
.DESCRIPTION
   Publish visual studio solution
.EXAMPLE
   Publish-VisualStudioSolution D:\Projects\project.sln
.NOTES
   Author: Imrich Szolik
#>

function Publish-VisualStudioSolution
{
    [CmdletBinding()]
    [Alias()]
    Param
    (
        # Solution file (sln)
        [string]
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$false, HelpMessage="Project file.")]
        $SolutionFile,
        #Configuration
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Configuration.")]
        [ValidateSet('Debug','Release')]
        [string]
        $Configuration = "Release",
        #Runtime
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Runtime.")]
        [string]
        $Runtime = "win-x64",
        #Enable self contained publish
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Enable self contained publish.")]
        [switch]
        $SelfContained,
        #Enable single file publish
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Enable single file publish.")]
        [switch]
        $SingleFile,
        #Publish path.
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Publish path.")]
        [string]
        $PublishPath
    )
    Begin
    {
        #validate SolutionFile
        if( (-not (Test-Path -Path $SolutionFile -PathType Leaf)) -or (-not ( $SolutionFile -like '*.sln')) ){
            throw "$SolutionFile is not valid"
        }
        
        #
        $SingleFileValue = "false"
        if($SingleFile) {
            $SingleFileValue = "true"
        }

        #
        $SelfContainedValue = "false"
        if($SelfContained) {
            $SelfContainedValue = "true"
        }
        
        if([string]::IsNullOrEmpty($PublishPath)){
            $PublishPath = "publish"
        }
        
        $solutionPath = Split-Path -Parent $SolutionFile
    }
    Process
    {
        #set version
        Update-VersionInfo set $SolutionFile
    
        #cleanup
        Write-Verbose "Remove old publish [$PublishPath]"
        Remove-Item $PublishPath -Force -Recurse -ErrorAction SilentlyContinue
    
        #configs
        $lomtecConfigs =  Get-ChildItem -Recurse $solutionPath -Filter lomtec.json | Select-Object -ExpandProperty FullName
        foreach($lomtec in $lomtecConfigs){
            #json
            $json = Get-Content $lomtec | ConvertFrom-Json
            #project
            if($json.Publish.Enabled){
                $project = Get-ChildItem (Split-Path -Parent $lomtec) -Filter "*.csproj" | Select-Object -ExpandProperty FullName -First 1
                #
                if( -not ( $null -eq $project) ) {
                    if([string]::IsNullOrEmpty($json.Publish.Path)){
                        $publish  = "$PublishPath\$(Split-Path -Leaf ( Split-Path -Parent $project ))"
                    }
                    else{
                        $publish  = "$PublishPath\$($json.Publish.Path)"
                    }
                    Write-Host "#### PUBLISH $(Split-Path -Parent $project) to $publish ####"
                    dotnet publish -nologo --verbosity quiet --runtime $Runtime --configuration $Configuration --self-contained $SelfContainedValue -p:PublishSingleFile=$SingleFileValue $project --output $publish
                }
            }
            else{
                Write-Warning "#### PUBLISH $(Split-Path -Parent $lomtec) is not enabled ####"
            }            
        }

        
        #cleanup
        Write-Verbose "Publish cleanup"
        Get-ChildItem -Path $PublishPath -Recurse -Filter *.pdb -File | Remove-Item -Force
        
        #reset version
        Update-VersionInfo reset $SolutionFile
    }
    End
    {
    }
}

Export-ModuleMember -Function Publish-VisualStudioSolution



# SIG # Begin signature block
# MIIH7gYJKoZIhvcNAQcCoIIH3zCCB9sCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQheNJA27gF9bHLAuKqkIWEwX
# 9QWgggUPMIIFCzCCAvOgAwIBAgICAKUwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNV
# BAYTAlNLMREwDwYDVQQIEwhTbG92YWtpYTETMBEGA1UEBxMKQnJhdGlzbGF2YTET
# MBEGA1UEChMKTG9tdGVjLmNvbTErMCkGA1UEAxMiTG9tdGVjLmNvbSBDZXJ0aWZp
# Y2F0aW9uIEF1dGhvcml0eTEnMCUGCSqGSIb3DQEJARYYSW1yaWNoLlN6b2xpa0Bs
# b210ZWMuY29tMB4XDTE5MDMyNjE1MDQ0M1oXDTMwMDEwMTAwMDAwMFowgZMxCzAJ
# BgNVBAYTAlNLMREwDwYDVQQIEwhTbG92YWtpYTETMBEGA1UEBxMKQnJhdGlzbGF2
# YTETMBEGA1UEChMKTG9tdGVjLmNvbTEeMBwGA1UEAxMVTG9tdGVjLmNvbSBQb3dl
# cnNoZWxsMScwJQYJKoZIhvcNAQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20w
# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+J+Jwh25Ha39PSBzRUNj/
# 8+iONxiknLBSTkB1DJEQ9wC6FBS/1EQvbFtn2K6huVZBQCoZzNFcXoiAked3ALIT
# UoYxX+fD4Wkve947QqCXGroCFQVaBSLkPoJzWCadlXQWyDyjFuCY42TsQRJB6TFp
# n4rVylhinlOvEHJ96COjzvmEs7X1y3tTVPtRiDt3wOxNLx1T1H/6lmVzGFORJS0F
# ZvQF231+/Zk4Je+gOe/jguo/gHoZHdjj31JeMLJ6Md3zslAFAPIqI3lofez6V3f7
# PkZLsVnYLAuGElg1I4WUswZJpfbnq2KqPWvlwG9/Xb5KSvUz5d6uRzQUDJAn6fG5
# AgMBAAGjWjBYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgeAMCsGA1UdJQQkMCIGCCsG
# AQUFBwMDBgorBgEEAYI3AgEVBgorBgEEAYI3AgEWMBEGCWCGSAGG+EIBAQQEAwIE
# sDANBgkqhkiG9w0BAQsFAAOCAgEACSWqb/bJGI4eR07CZ6g3baoe2Djl7gPIPgyg
# Y/uYAxGROVfVYQBVafFCfUaCExhiEU1SHdJanCyYlUkx8d9OVVvWiA/L6O+5H608
# l7z1zSLE7R5z5JMB+O/gqImNyKT0C41AP0OkHasCDb78KJu/1nPjqCKpT3SR+Q2w
# ayMvOXa+jPy5t0cNgaJXE0cF0wd8QIcHrYe/AT+qW3AHd9hXcppEaKSyIobjbO4O
# 2Uf0P+fNNxvjokCDERsk72kPmkIyYBaZM6ezSMIc6LoHwjleO0nPPYxKVKsNeotl
# BX89ssDpVlMmLbntUtT4zNZY4CX0aPntMFJxaYBUM1xhdW02FWkOHt5yZXgA376n
# l6B9gGHgU28/QXKIJJH1EQAt4oqG9WzbOYxNQm6xAwsOpv9N5NKDppt8UJLF8gIQ
# WLlJEcLvY3eMtxcGf7Mgxi892+nGPKNWMiDTjgNwdq/drITbdK1oSbt7/qnCFZhU
# NGipYTTUaIlZUICezYDtFFfr1NpYIrHKVEsRLcSjfuOdK+PbLtOjQOs7Mp9whC1J
# lZD8o8eX8os8LfSsVbmDlEhG99mO0An3xydarRekrkKym4G/9uMu3Ag1ujw1Ubzz
# sklJSrvbD8pCAg4781wb42BCCzOwJrWAiARkIIpgbEL0xKFyV4sADotVzc9y8XI0
# B0P2TOMxggJJMIICRQIBATCBpzCBoDELMAkGA1UEBhMCU0sxETAPBgNVBAgTCFNs
# b3Zha2lhMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpMb210ZWMuY29t
# MSswKQYDVQQDEyJMb210ZWMuY29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MScw
# JQYJKoZIhvcNAQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20CAgClMAkGBSsO
# AwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM
# BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEWMCMGCSqG
# SIb3DQEJBDEWBBSesvpoYwui23Pk1uzBkSoKnu70gjANBgkqhkiG9w0BAQEFAASC
# AQC93NHMW2lQ1hVWxSeg5BgTrpyjtvF4EO7Ei5YdLfm2DdXPmKCp/OD15d7fBvdK
# Vx/6Iz3OCeyEkRSBTQyadb65/63RSlRlrKhAz2DWT79vUjoDaL01nLzPIXo3ugiw
# 3JS9r8uhA8+zRSS0Buqy2JCGLh6N23WkDfjVzlUnNqkqUJDt++tiIQ29t14A4JTV
# U/gONyn9eqC0oExcXdn9klmQv+sLc3YMop+SMIxR7+rJVaLP5MKc/Cehn4iXlI+a
# iMlnJEWUw1K2fuk1OgIhRxbKcTy0LTuDsZ/xLqfVvj4xNf5hXBrU8QHATsbHnqJy
# 8i5oMGuRwYLCwj+Z3Y3CyPSG
# SIG # End signature block