From 5d70e11f170f91eaac7c27448196211ffbe81b81 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 12 Feb 2026 16:03:06 +0800 Subject: [PATCH] [feat] support Windows x64 portable build, refs #54 --- .github/workflows/build.yml | 19 ++++++++++++++++++ .github/workflows/update-version-json.yml | 24 +++++++++++++---------- scripts/windows/crossdesk.rc | 2 ++ scripts/windows/nsis_script.nsi | 14 +++---------- xmake.lua | 5 ++++- 5 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 scripts/windows/crossdesk.rc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f525f37..3fc0405 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -289,12 +289,26 @@ jobs: cd "${{ github.workspace }}\scripts\windows" makensis /DVERSION=$env:VERSION_NUM nsis_script.nsi + - name: Package Portable + shell: pwsh + run: | + $portableDir = "${{ github.workspace }}\portable" + New-Item -ItemType Directory -Force -Path $portableDir + Copy-Item "${{ github.workspace }}\build\windows\x64\release\crossdesk.exe" $portableDir + Compress-Archive -Path "$portableDir\*" -DestinationPath "${{ github.workspace }}\crossdesk-win-x64-portable-${{ env.VERSION_NUM }}.zip" + - name: Upload artifact uses: actions/upload-artifact@v4 with: name: crossdesk-win-x64-${{ env.VERSION_NUM }} path: ${{ github.workspace }}/scripts/windows/crossdesk-win-x64-${{ env.VERSION_NUM }}.exe + - name: Upload portable artifact + uses: actions/upload-artifact@v4 + with: + name: crossdesk-win-x64-portable-${{ env.VERSION_NUM }} + path: ${{ github.workspace }}/crossdesk-win-x64-portable-${{ env.VERSION_NUM }}.zip + release: name: Publish Release if: startsWith(github.ref, 'refs/tags/v') @@ -335,6 +349,7 @@ jobs: cp artifacts/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}.deb cp artifacts/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}.deb cp artifacts/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe + cp artifacts/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip - name: List release files run: ls -lh release/ @@ -392,6 +407,10 @@ jobs: "url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe", "filename": "crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe" }, + "windows-x64-portable": { + "url": "https://downloads.crossdesk.cn/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip", + "filename": "crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip" + }, "macos-x64": { "url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg", "filename": "crossdesk-macos-x64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg" diff --git a/.github/workflows/update-version-json.yml b/.github/workflows/update-version-json.yml index 3225660..ae3db0f 100644 --- a/.github/workflows/update-version-json.yml +++ b/.github/workflows/update-version-json.yml @@ -11,7 +11,7 @@ jobs: update-version-json: name: Update version.json with release information runs-on: ubuntu-latest - + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -25,7 +25,7 @@ jobs: VERSION_ONLY="${TAG_NAME#v}" echo "TAG_NAME=${TAG_NAME}" >> $GITHUB_OUTPUT echo "VERSION_ONLY=${VERSION_ONLY}" >> $GITHUB_OUTPUT - + # Extract date from tag if available (format: v1.2.3-20251113-abc) if [[ "${TAG_NAME}" =~ -([0-9]{8})- ]]; then DATE_STR="${BASH_REMATCH[1]}" @@ -45,7 +45,7 @@ jobs: # Use jq to properly escape JSON RELEASE_BODY="${{ github.event.release.body }}" RELEASE_NAME="${{ github.event.release.name }}" - + # Handle empty values if [ -z "$RELEASE_BODY" ]; then RELEASE_BODY="" @@ -53,15 +53,15 @@ jobs: if [ -z "$RELEASE_NAME" ]; then RELEASE_NAME="" fi - + # Save to temporary files for proper handling echo -n "$RELEASE_BODY" > /tmp/release_body.txt echo -n "$RELEASE_NAME" > /tmp/release_name.txt - + # Use jq to escape JSON strings RELEASE_BODY_JSON=$(jq -Rs . < /tmp/release_body.txt) RELEASE_NAME_JSON=$(jq -Rs . < /tmp/release_name.txt) - + echo "RELEASE_BODY=${RELEASE_BODY_JSON}" >> $GITHUB_OUTPUT echo "RELEASE_NAME=${RELEASE_NAME_JSON}" >> $GITHUB_OUTPUT @@ -85,7 +85,7 @@ jobs: else DOWNLOADS_JSON="" fi - + # If downloads is empty, use default structure if [ -z "$DOWNLOADS_JSON" ]; then DOWNLOADS_JSON=$(cat << DOWNLOADS_EOF @@ -94,6 +94,10 @@ jobs: "url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe", "filename": "crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe" }, + "windows-x64-portable": { + "url": "https://downloads.crossdesk.cn/crossdesk-win-x64-portable-${{ steps.version.outputs.TAG_NAME }}.zip", + "filename": "crossdesk-win-x64-portable-${{ steps.version.outputs.TAG_NAME }}.zip" + }, "macos-x64": { "url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg", "filename": "crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg" @@ -114,7 +118,7 @@ jobs: DOWNLOADS_EOF ) fi - + # Generate version.json using cat and heredoc cat > version.json << EOF { @@ -126,7 +130,7 @@ jobs: "downloads": ${DOWNLOADS_JSON} } EOF - + cat version.json - name: Upload version.json to server @@ -137,4 +141,4 @@ jobs: remote_path: /var/www/html/version/ remote_host: ${{ secrets.SERVER_HOST }} remote_user: ${{ secrets.SERVER_USER }} - remote_key: ${{ secrets.SERVER_KEY }} \ No newline at end of file + remote_key: ${{ secrets.SERVER_KEY }} diff --git a/scripts/windows/crossdesk.rc b/scripts/windows/crossdesk.rc new file mode 100644 index 0000000..ddfc5a8 --- /dev/null +++ b/scripts/windows/crossdesk.rc @@ -0,0 +1,2 @@ +// Application icon (IDI_ICON1 = 1, which is the default app icon resource ID) +IDI_ICON1 ICON "..\\..\\icons\\windows\\crossdesk.ico" diff --git a/scripts/windows/nsis_script.nsi b/scripts/windows/nsis_script.nsi index 52eadec..3c40519 100644 --- a/scripts/windows/nsis_script.nsi +++ b/scripts/windows/nsis_script.nsi @@ -73,9 +73,6 @@ installApp: ; Main application executable path File /oname=crossdesk.exe "..\..\build\windows\x64\release\crossdesk.exe" - - ; Copy icon file to installation directory - File "${MUI_ICON}" ; Write uninstall information WriteUninstaller "$INSTDIR\uninstall.exe" @@ -85,23 +82,18 @@ installApp: WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayIcon" "$INSTDIR\crossdesk.ico" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayIcon" "$INSTDIR\crossdesk.exe" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoRepair" 1 WriteRegStr HKCU "Software\${PRODUCT_NAME}" "InstallDir" "$INSTDIR" SectionEnd -; After installation -Section -Post - ExecWait '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\mt.exe" -manifest "$INSTDIR\crossdesk.manifest" -outputresource:"$INSTDIR\crossdesk.exe";1' -SectionEnd - Section -AdditionalIcons ; Desktop shortcut - CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.ico" + CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.exe" ; Start menu shortcut - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.ico" + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.exe" SectionEnd Section "Uninstall" diff --git a/xmake.lua b/xmake.lua index 4059df2..b866d39 100644 --- a/xmake.lua +++ b/xmake.lua @@ -203,4 +203,7 @@ target("crossdesk") set_kind("binary") add_deps("rd_log", "common", "gui") add_files("src/app/*.cpp") - add_includedirs("src/app", {public = true}) \ No newline at end of file + add_includedirs("src/app", {public = true}) + if is_os("windows") then + add_files("scripts/windows/crossdesk.rc") + end \ No newline at end of file