Flow.Launcher/Scripts/post_build.ps1
Hongtao Zhang e726c44559 ci: add self-contained publish for Avalonia build
- Add Net9.0-SelfContained.pubxml publish profile for Avalonia
- Add Publish-Self-Contained-Avalonia function to post_build.ps1
- Call Avalonia publish before cleanup in Main function
2026-01-26 16:30:24 -08:00

189 lines
No EOL
6.7 KiB
PowerShell

param(
[string]$config = "Release",
[string]$solution = (Join-Path $PSScriptRoot ".." -Resolve)
)
Write-Host "Config: $config"
function Build-Version {
if ([string]::IsNullOrEmpty($env:flowVersion)) {
$targetPath = Join-Path $solution "Output/Release/Flow.Launcher.dll" -Resolve
$v = (Get-Command ${targetPath}).FileVersionInfo.FileVersion
} else {
$v = $env:flowVersion
}
Write-Host "Build Version: $v"
return $v
}
function Build-Path {
if (![string]::IsNullOrEmpty($env:APPVEYOR_BUILD_FOLDER)) {
$p = $env:APPVEYOR_BUILD_FOLDER
} elseif (![string]::IsNullOrEmpty($solution)) {
$p = $solution
} else {
$p = Get-Location
}
Write-Host "Build Folder: $p"
Set-Location $p
return $p
}
function Copy-Resources ($path) {
# making version static as multiple versions can exist in the nuget folder and in the case a breaking change is introduced.
Copy-Item -Force $env:USERPROFILE\.nuget\packages\squirrel.windows\1.9.0\tools\Squirrel.exe $path\Output\Update.exe
}
function Delete-Unused ($path, $config) {
$target = "$path\Output\$config"
$included = Get-ChildItem $target -Filter "*.dll"
foreach ($i in $included){
$deleteList = Get-ChildItem $target\Plugins -Include $i -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq "$i" }
$deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName }
$deleteList | Remove-Item
}
Remove-Item -Path $target -Include "*.xml" -Recurse
}
function Remove-CreateDumpExe ($path, $config) {
$target = "$path\Output\$config"
$depjson = Get-Content $target\Flow.Launcher.deps.json -raw
$depjson -replace '(?s)(.createdump.exe": {.*?}.*?\n)\s*', "" | Out-File $target\Flow.Launcher.deps.json -Encoding UTF8
Remove-Item -Path $target -Include "*createdump.exe" -Recurse
}
function Remove-CreateDumpExe-Avalonia ($path, $config) {
$target = "$path\Output\$config\Avalonia"
if (Test-Path "$target\Flow.Launcher.Avalonia.deps.json") {
$depjson = Get-Content $target\Flow.Launcher.Avalonia.deps.json -raw
$depjson -replace '(?s)(.createdump.exe": {.*?}.*?\n)\s*', "" | Out-File $target\Flow.Launcher.Avalonia.deps.json -Encoding UTF8
}
Remove-Item -Path $target -Include "*createdump.exe" -Recurse -ErrorAction SilentlyContinue
}
function Delete-Unused-Avalonia ($path, $config) {
$target = "$path\Output\$config\Avalonia"
if (!(Test-Path $target)) {
Write-Host "Avalonia output not found at $target, skipping..."
return
}
$included = Get-ChildItem $target -Filter "*.dll"
if (Test-Path "$target\Plugins") {
foreach ($i in $included){
$deleteList = Get-ChildItem $target\Plugins -Include $i -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq "$i" }
$deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName }
$deleteList | Remove-Item
}
}
Remove-Item -Path $target -Include "*.xml" -Recurse -ErrorAction SilentlyContinue
}
function Validate-Directory ($output) {
New-Item $output -ItemType Directory -Force
}
function Pack-Squirrel-Installer ($path, $version, $output) {
# msbuild based installer generation is not working in appveyor, not sure why
Write-Host "Begin pack squirrel installer"
$spec = "$path\Scripts\flowlauncher.nuspec"
$input = "$path\Output\Release"
Write-Host "Packing: $spec"
Write-Host "Input path: $input"
# dotnet pack is not used because ran into issues, need to test installation and starting up if to use it.
nuget pack $spec -Version $version -BasePath $input -OutputDirectory $output -Properties Configuration=Release
$nupkg = "$output\FlowLauncher.$version.nupkg"
Write-Host "nupkg path: $nupkg"
$icon = "$path\Flow.Launcher\Resources\app.ico"
Write-Host "icon: $icon"
# Squirrel.com: https://github.com/Squirrel/Squirrel.Windows/issues/369
New-Alias Squirrel $env:USERPROFILE\.nuget\packages\squirrel.windows\1.9.0\tools\Squirrel.exe -Force
# why we need Write-Output: https://github.com/Squirrel/Squirrel.Windows/issues/489#issuecomment-156039327
# directory of releaseDir in squirrel can't be same as directory ($nupkg) in releasify
$temp = "$output\Temp"
Squirrel --releasify $nupkg --releaseDir $temp --setupIcon $icon --no-msi | Write-Output
Move-Item $temp\* $output -Force
Remove-Item $temp
$file = "$output\Flow-Launcher-Setup.exe"
Write-Host "Filename: $file"
Move-Item "$output\Setup.exe" $file -Force
Write-Host "End pack squirrel installer"
}
function Publish-Self-Contained ($p) {
$csproj = Join-Path "$p" "Flow.Launcher/Flow.Launcher.csproj" -Resolve
$profile = Join-Path "$p" "Flow.Launcher/Properties/PublishProfiles/Net9.0-SelfContained.pubxml" -Resolve
# we call dotnet publish on the main project.
# The other projects should have been built in Release at this point.
dotnet publish -c Release $csproj /p:PublishProfile=$profile
}
function Publish-Self-Contained-Avalonia ($p) {
$csproj = "$p\Flow.Launcher.Avalonia\Flow.Launcher.Avalonia.csproj"
$profile = "$p\Flow.Launcher.Avalonia\Properties\PublishProfiles\Net9.0-SelfContained.pubxml"
if (!(Test-Path $csproj)) {
Write-Host "Avalonia project not found at $csproj, skipping self-contained publish..."
return
}
if (!(Test-Path $profile)) {
Write-Host "Avalonia publish profile not found at $profile, skipping self-contained publish..."
return
}
Write-Host "Publishing Avalonia self-contained..."
dotnet publish -c Release $csproj /p:PublishProfile=$profile
}
function Publish-Portable ($outputLocation, $version) {
& $outputLocation\Flow-Launcher-Setup.exe --silent | Out-Null
mkdir "$env:LocalAppData\FlowLauncher\app-$version\UserData"
Compress-Archive -Path $env:LocalAppData\FlowLauncher -DestinationPath $outputLocation\Flow-Launcher-Portable.zip
}
function Main {
$p = Build-Path
$v = Build-Version
Copy-Resources $p
if ($config -eq "Release"){
Delete-Unused $p $config
Publish-Self-Contained $p
Remove-CreateDumpExe $p $config
# Process Avalonia build
Publish-Self-Contained-Avalonia $p
Delete-Unused-Avalonia $p $config
Remove-CreateDumpExe-Avalonia $p $config
$o = "$p\Output\Packages"
Validate-Directory $o
Pack-Squirrel-Installer $p $v $o
Publish-Portable $o $v
}
}
Main