From 27810e4ca1c8197adcaa93845dc48f3550bc5f31 Mon Sep 17 00:00:00 2001 From: zeje Date: Thu, 21 May 2026 16:53:43 +0800 Subject: [PATCH] create-dmg (#818) * create-dmg * create-dmg-update * Potential fix for pull request finding OK Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .editorconfig | 3 + .github/workflows/publish.yml | 115 ++++++++++++++++++ .github/workflows/release-tag.yml | 8 +- .../Info-macOS.plist | 20 +++ .../Semi.Avalonia.Demo.Desktop.csproj | 75 ++++++++---- 5 files changed, 194 insertions(+), 27 deletions(-) create mode 100644 demo/Semi.Avalonia.Demo.Desktop/Info-macOS.plist diff --git a/.editorconfig b/.editorconfig index 2a45ec1..610d722 100644 --- a/.editorconfig +++ b/.editorconfig @@ -233,6 +233,9 @@ indent_size = 2 [*.json] indent_size = 2 +[*.{yml,yaml}] +indent_size = 2 + # Shell scripts [*.sh] end_of_line = lf diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 51e3b14..465c145 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -35,6 +35,14 @@ on: description: 'macOS arm64 AOT' default: false type: boolean + osx-x64: + description: 'macOS Intel x64' + default: false + type: boolean + osx-x64-aot: + description: 'macOS Intel x64 AOT' + default: false + type: boolean android-arm64: description: 'Android arm64' default: false @@ -65,6 +73,12 @@ on: osx-arm64-aot: type: boolean default: true + osx-x64: + type: boolean + default: true + osx-x64-aot: + type: boolean + default: true android-arm64: type: boolean default: true @@ -180,6 +194,33 @@ jobs: uses: actions/checkout@v6 - name: Publish osx-arm64 run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r osx-arm64 -c Release -o publish --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true + + - name: Create .app bundle and DMG (create-dmg) + run: | + set -euo pipefail + APP_DIR="bundle/Semi.Avalonia.Demo.app" + MACOS_DIR="${APP_DIR}/Contents/MacOS" + mkdir -p "${MACOS_DIR}" + cp -R publish/. "${MACOS_DIR}/" + chmod +x "${MACOS_DIR}/Semi.Avalonia.Demo.Desktop" + cp publish/Info-macOS.plist "${APP_DIR}/Contents/Info.plist" + codesign --force --deep --sign - "${APP_DIR}" + mkdir -p dmg_stage + ditto "${APP_DIR}" "dmg_stage/Semi.Avalonia.Demo.app" + brew install create-dmg + rm -f Semi.Avalonia.Demo.Desktop.osx-arm64.dmg + create-dmg \ + --volname "Semi Avalonia Demo" \ + --window-pos 200 120 \ + --window-size 640 400 \ + --icon-size 100 \ + --icon "Semi.Avalonia.Demo.app" 175 185 \ + --hide-extension "Semi.Avalonia.Demo.app" \ + --app-drop-link 455 185 \ + --skip-jenkins \ + "Semi.Avalonia.Demo.Desktop.osx-arm64.dmg" \ + "dmg_stage" + - name: Upload a Build Artifact uses: actions/upload-artifact@v7 with: @@ -188,6 +229,62 @@ jobs: publish !publish/*.pdb + - name: Upload macOS DMG + uses: actions/upload-artifact@v7 + with: + name: Semi.Avalonia.Demo.Desktop.osx-arm64.dmg + path: Semi.Avalonia.Demo.Desktop.osx-arm64.dmg + + osx-x64: + if: ${{inputs.osx-x64}} + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Publish osx-x64 + run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r osx-x64 -c Release -o publish --sc /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true + + - name: Create .app bundle and DMG (create-dmg) + run: | + set -euo pipefail + APP_DIR="bundle/Semi.Avalonia.Demo.app" + MACOS_DIR="${APP_DIR}/Contents/MacOS" + mkdir -p "${MACOS_DIR}" + cp -R publish/. "${MACOS_DIR}/" + chmod +x "${MACOS_DIR}/Semi.Avalonia.Demo.Desktop" + cp publish/Info-macOS.plist "${APP_DIR}/Contents/Info.plist" + codesign --force --deep --sign - "${APP_DIR}" + mkdir -p dmg_stage + ditto "${APP_DIR}" "dmg_stage/Semi.Avalonia.Demo.app" + brew install create-dmg + rm -f Semi.Avalonia.Demo.Desktop.osx-x64.dmg + create-dmg \ + --volname "Semi Avalonia Demo" \ + --window-pos 200 120 \ + --window-size 640 400 \ + --icon-size 100 \ + --icon "Semi.Avalonia.Demo.app" 175 185 \ + --hide-extension "Semi.Avalonia.Demo.app" \ + --app-drop-link 455 185 \ + --skip-jenkins \ + "Semi.Avalonia.Demo.Desktop.osx-x64.dmg" \ + "dmg_stage" + + - name: Upload a Build Artifact + uses: actions/upload-artifact@v7 + with: + name: Semi.Avalonia.Demo.Desktop.osx-x64 + path: | + publish + !publish/*.pdb + + - name: Upload macOS DMG (Intel) + uses: actions/upload-artifact@v7 + with: + name: Semi.Avalonia.Demo.Desktop.osx-x64.dmg + path: Semi.Avalonia.Demo.Desktop.osx-x64.dmg + osx-arm64-aot: if: ${{inputs.osx-arm64-aot}} runs-on: macos-latest @@ -206,6 +303,24 @@ jobs: publish !publish/*.pdb + osx-x64-aot: + if: ${{inputs.osx-x64-aot}} + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Enable Native AOT in .csproj + run: sed -i '' 's##true#' demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj + - name: Publish osx-x64 AOT + run: dotnet publish demo/Semi.Avalonia.Demo.Desktop -r osx-x64 -c Release -o publish + - name: Upload a Build Artifact + uses: actions/upload-artifact@v7 + with: + name: Semi.Avalonia.Demo.Desktop.osx-x64.NativeAOT + path: | + publish + !publish/*.pdb + android-arm64: if: ${{inputs.android-arm64 }} runs-on: windows-latest diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index ab103c4..7bda509 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -58,6 +58,10 @@ jobs: zip -rj Semi.Avalonia.Demo.Desktop.osx-arm64.zip Semi.Avalonia.Demo.Desktop.osx-arm64 cd Semi.Avalonia.Demo.Desktop.osx-arm64.NativeAOT zip -r ../Semi.Avalonia.Demo.Desktop.osx-arm64.NativeAOT.zip . + cd "${GITHUB_WORKSPACE}" + zip -rj Semi.Avalonia.Demo.Desktop.osx-x64.zip Semi.Avalonia.Demo.Desktop.osx-x64 + cd Semi.Avalonia.Demo.Desktop.osx-x64.NativeAOT + zip -r ../Semi.Avalonia.Demo.Desktop.osx-x64.NativeAOT.zip . - name: Display structure of zipped files run: ls -R @@ -71,4 +75,6 @@ jobs: files: | nugets/*.nupkg android-arm64/*.apk - *.zip \ No newline at end of file + *.zip + Semi.Avalonia.Demo.Desktop.osx-arm64.dmg/Semi.Avalonia.Demo.Desktop.osx-arm64.dmg + Semi.Avalonia.Demo.Desktop.osx-x64.dmg/Semi.Avalonia.Demo.Desktop.osx-x64.dmg \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Desktop/Info-macOS.plist b/demo/Semi.Avalonia.Demo.Desktop/Info-macOS.plist new file mode 100644 index 0000000..aadc6f8 --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Desktop/Info-macOS.plist @@ -0,0 +1,20 @@ + + + + + CFBundleExecutable + Semi.Avalonia.Demo.Desktop + CFBundleIdentifier + org.avaloniaui.SemiAvaloniaDemo + CFBundleName + Semi Avalonia Demo + CFBundlePackageType + APPL + CFBundleShortVersionString + $(Version) + CFBundleVersion + $(Version) + LSMinimumSystemVersion + 10.15 + + diff --git a/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj b/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj index 45a0ea5..e87e5f0 100644 --- a/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj +++ b/demo/Semi.Avalonia.Demo.Desktop/Semi.Avalonia.Demo.Desktop.csproj @@ -1,33 +1,56 @@  - - WinExe - net10.0 - enable - true - ..\Semi.Avalonia.Demo\Assets\irihi.ico - - - + + WinExe + net10.0 + 1.0.0 + enable + true + ..\Semi.Avalonia.Demo\Assets\irihi.ico + + + - - true - true - + + true + true + - - app.manifest - + + app.manifest + - - - + + + - - - + + + - - - - + + + + + + + + + + + + + + + + + +