AL/Invoke-CompileApp.ps1

function Invoke-CompileApp {
    Param(
        [Parameter(Mandatory=$false)]
        [string] $ContainerName,
        [Parameter(Mandatory=$true)]
        [securestring] $pfxFile,
        [Parameter(Mandatory=$true)]
        [securestring] $pfxPassword,
        [Parameter(Mandatory=$false)]
        [string] $SourcePath = (Get-Location),
        [Parameter(Mandatory=$true)]
        [string] $OutputPath,
        [Parameter(Mandatory=$false)]
        [string] $BuildNumber = "",
        [switch] $DoNotUpdateVersion,
        [switch] $DoNotInstallApp
    )

    if ($null -eq $ContainerName -or $ContainerName -eq "") {
        $ContainerName = (Get-EnvironmentKeyValue -KeyName 'name')
    }

    if (!(Test-Path $OutputPath)) {
        New-EmptyDirectory $OutputPath
    }
    if (!(Test-Path (Join-Path $OutputPath "app"))) {
        New-EmptyDirectory (Join-Path $OutputPath "app")
    }
    if (!(Test-Path (Join-Path $OutputPath "runtimeapp"))) {
        New-EmptyDirectory (Join-Path $OutputPath "runtimeapp")
    }
    if (!(Test-Path (Join-Path $OutputPath "testapp"))) {
        New-EmptyDirectory (Join-Path $OutputPath "testapp")
    }
    if (!(Test-Path (Join-Path $OutputPath "tests"))) {
        New-EmptyDirectory (Join-Path $OutputPath "tests")
    }

    $CompilerPath = Get-CompilerFromContainer -ContainerName $ContainerName
    Get-Symbols -SourcePath $SourcePath -ContainerName $ContainerName

    #update the app version with the build number (actually store it in the Revision - the last element of the version no)
    if (!$DoNotUpdateVersion.IsPresent) {
        if ($BuildNumber -eq "") {
            throw "BuildNumber missing"
        }
        $AppVersion = [System.Version]::new((Get-AppKeyValue -SourcePath $SourcePath -KeyName 'version'))
        Set-AppKeyValue -SourcePath $SourcePath -KeyName 'version' -KeyValue ('{0}.{1}.{2}.{3}' -f $AppVersion.Major, $AppVersion.Minor, $AppVersion.Build, $BuildNumber)
    }

    try {
    Remove-Item (Join-Path $SourcePath '.altemplates') -Recurse -Force
    Remove-Item (Join-Path $SourcePath '.altestrunner') -Recurse -Force
    }
    catch {
        Write-Host "Did not remove folders"
    }

    # first compile the app only (remove tests)
    $TestPath = New-TempDirectory
    Copy-Item "$SourcePath/*" $TestPath -Recurse

    # update dependencies
    Remove-ALTestDependencies -sourcePath $SourcePath

    #set the target, if applicable
    if ((Get-EnvironmentKeyValue -SourcePath $SourcePath -KeyName target) -ne "") {
        Set-AppKeyValue -SourcePath $TestPath -KeyName target -KeyValue (Get-EnvironmentKeyValue -SourcePath $SourcePath -KeyName target)
    }
    
    Remove-Item (Join-Path $SourcePath 'Tests') -Recurse -Force

    if (!(Invoke-BuildALAppPackage -SourcePath $SourcePath -ContainerName $ContainerName -CompilerPath $CompilerPath -SignApp -DoNotDownloadSymbols -Install:(!$DoNotInstallApp.IsPresent) -pfxFile $pfxFile -pfxPassword $pfxPassword)){
        exit
    }
    Copy-Item "$SourcePath/*.app" "$OutputPath/app"
    Copy-Item "$SourcePath/*.app" "$TestPath/.alpackages"

    #build the test app
    $TestAppId = Get-EnvironmentKeyValue -SourcePath $SourcePath -KeyName 'testappid'
    if($null -eq $TestAppId) {
        $TestAppId = ([Guid]::NewGuid().Guid)
    }

    Set-AppKeyValue -SourcePath $TestPath -KeyName id -KeyValue $TestAppId
    Set-AppKeyValue -SourcePath $TestPath -KeyName name -KeyValue ('{0} Tests' -f (Get-AppKeyValue -SourcePath $TestPath -KeyName name))
    Set-AppKeyValue -SourcePath $TestPath -KeyName screenshots ''

    #add dependency on test symbols for test app
    [version]$BCFallPlatform = '15.0.0.0'
    [version]$platform = Get-AppKeyValue -SourcePath $TestPath -KeyName 'platform'
    if ($platform -ge $BCFallPlatform){
        Add-TestAppsToAppJson -SourcePath $TestPath
        Get-Symbols -SourcePath $TestPath -ContainerName $ContainerName
    }
    else{
        # for 2018, it doesn't properly work to have "test" set, since it updates the symbols when importing the objects (due to possible base object compiles)
        if ($platform.Major -gt 11) {
            Set-AppKeyValue -SourcePath $TestPath -KeyName 'test' -KeyValue (Get-AppKeyValue -KeyName 'application')
            Get-Symbols -SourcePath $TestPath -ContainerName $ContainerName -includeTestSymbols
        }
    }

    New-ALAppDependency -SourcePath $TestPath `
                        -Id (Get-AppKeyValue -SourcePath $SourcePath -KeyName id) `
                        -Name (Get-AppKeyValue -SourcePath $SourcePath -KeyName name) `
                        -Publisher (Get-AppKeyValue -SourcePath $SourcePath -KeyName publisher) `
                        -Version (Get-AppKeyValue -SourcePath $SourcePath -KeyName version)

    #remove all directories from the test app apart from those beginning with . and the Logo and Tests folders
    Get-ChildItem $TestPath -Directory | Where-Object Name -NotLike '.*' | Where-Object Name -NotLike Tests | Where-Object Name -NotLike *Logo* | ForEach-Object {Remove-Item $_.FullName -Force -Recurse}
    
    #remove dotnet.al file for test app
    Get-ChildItem $TestPath | Where-Object Name -Like 'dotnet.al' | ForEach-Object {Remove-Item $_.FullName -Force -Recurse}

    if ((Get-EnvironmentKeyValue -KeyName 'tests') -eq 'skip') {
        Invoke-BuildALAppPackage -SourcePath $TestPath -ContainerName $ContainerName -CompilerPath $CompilerPath -DoNotDownloadSymbols -pfxFile $pfxFile -pfxPassword $pfxPassword
    }
    else {
        Invoke-BuildALAppPackage -SourcePath $TestPath -ContainerName $ContainerName -CompilerPath $CompilerPath -DoNotDownloadSymbols -Install:(!$DoNotInstallApp.IsPresent) -pfxFile $pfxFile -pfxPassword $pfxPassword
    }

    Copy-Item "$TestPath/*.app" (Join-Path $OutputPath "testapp")
    Remove-Item $TestPath -Recurse

    if ($CompilerPath -ne "") {
        Remove-Item (($CompilerPath -split '\\')[0..(($CompilerPath -split '\\').count -4)] -join '\') -Recurse
    }
}
Export-ModuleMember Invoke-CompileApp