diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 761210e..0559abc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,11 +61,23 @@ jobs: build: needs: prepare - runs-on: ${{ matrix.platform }} + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - platform: [windows-latest, macos-latest, ubuntu-22.04] + include: + - os: windows-latest + target: x86_64-pc-windows-msvc + - os: windows-latest + target: aarch64-pc-windows-msvc + - os: macos-13 + target: x86_64-apple-darwin + - os: macos-14 + target: aarch64-apple-darwin + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + - os: ubuntu-22.04-arm64 + target: aarch64-unknown-linux-gnu steps: - name: Checkout (tag) @@ -84,6 +96,9 @@ jobs: - name: Setup Rust uses: dtolnay/rust-toolchain@stable + - name: Add Rust target + run: rustup target add ${{ matrix.target }} + - name: Cache Rust uses: swatinem/rust-cache@v2 with: @@ -91,7 +106,7 @@ jobs: src-tauri -> src-tauri/target - name: Install Linux dependencies - if: matrix.platform == 'ubuntu-22.04' + if: startsWith(matrix.os, 'ubuntu-22.04') run: | sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf rpm @@ -115,26 +130,30 @@ jobs: prerelease: false tagName: ${{ needs.prepare.outputs.tag_name }} releaseName: EndCat ${{ needs.prepare.outputs.tag_name }} + target: ${{ matrix.target }} - name: Create portable exe (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.os == 'windows-latest' shell: pwsh run: | $version = "${{ needs.prepare.outputs.app_version }}" - $exe = "src-tauri/target/release/endfield-cat.exe" - if (-not (Test-Path -LiteralPath $exe)) { - throw "Missing binary: $exe" - } + $candidates = @( + "src-tauri/target/${{ matrix.target }}/release/endfield-cat.exe", + "src-tauri/target/release/endfield-cat.exe" + ) + $exe = $candidates | Where-Object { Test-Path -LiteralPath $_ } | Select-Object -First 1 + if (-not $exe) { throw "Missing binary for target ${{ matrix.target }}" } $outDir = "src-tauri/target/release/bundle/portable" New-Item -ItemType Directory -Force -Path $outDir | Out-Null - $portableExe = Join-Path $outDir ("endfield-cat_{0}_x64_portable.exe" -f $version) + $suffix = if ("${{ matrix.target }}" -like "aarch64*") { "arm64" } else { "x64" } + $portableExe = Join-Path $outDir ("endfield-cat_{0}_{1}_portable.exe" -f $version, $suffix) Copy-Item -LiteralPath $exe -Destination $portableExe -Force "PORTABLE_EXE=$portableExe" >> $env:GITHUB_ENV - name: Upload portable exe to release (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.os == 'windows-latest' shell: pwsh env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/src-tauri/src/app_cmd.rs b/src-tauri/src/app_cmd.rs index 97e6aed..2d42c4a 100644 --- a/src-tauri/src/app_cmd.rs +++ b/src-tauri/src/app_cmd.rs @@ -85,20 +85,17 @@ pub async fn reset_metadata( #[tauri::command] pub async fn update_metadata( window: tauri::Window, - app: AppHandle, + _app: AppHandle, client: State<'_, reqwest::Client>, base_url: Option, ) -> Result { let exe_dir = exe_dir()?; - - // Use app version for metadata URL - let app_version = app.package_info().version.to_string(); metadata::update_metadata( &exe_dir, &client, base_url, - Some(app_version), + None, |progress| { let _ = window.emit("metadata-update-progress", progress); }, diff --git a/src/pages/SettingsPage.vue b/src/pages/SettingsPage.vue index 99b0237..baa26d1 100644 --- a/src/pages/SettingsPage.vue +++ b/src/pages/SettingsPage.vue @@ -95,7 +95,7 @@ const testSourceConnection = async (source: MetadataSourceType) => { connectivity.value[source] = { status: 'testing', latency: 0, error: '' } const start = performance.now() try { - const version = appStore.currentAppVersion || metadataVersion.value + const version = metadataVersion.value.trim() || 'latest' await fetchMetadataManifest({ baseUrl, version @@ -304,7 +304,7 @@ const verifyMetadataFiles = async () => { const resetMetadata = async () => { resetMetadataLoading.value = true try { - const version = appStore.currentAppVersion || metadataVersion.value + const version = metadataVersion.value.trim() || 'latest' await resetMetadataCommand({ baseUrl: metadataBaseUrl.value, version diff --git a/src/stores/app.ts b/src/stores/app.ts index 4914275..958aa73 100644 --- a/src/stores/app.ts +++ b/src/stores/app.ts @@ -91,8 +91,8 @@ export const useAppStore = defineStore('app', () => { if (sourceType === 'custom') { return normalizeBaseUrl(customBase ?? metadataCustomBase.value) } - // 优先使用 app version,latest 作为兜底 - const version = currentAppVersion.value || metadataVersion.value.trim() || DEFAULT_METADATA_VERSION + // 默认使用 latest,可通过 metadataVersion 覆盖 + const version = metadataVersion.value.trim() || DEFAULT_METADATA_VERSION if (sourceType === 'mirror') { return METADATA_MIRROR_TEMPLATE.replace('{version}', version) } @@ -236,7 +236,7 @@ export const useAppStore = defineStore('app', () => { if (metadataBaseUrl.value.trim()) { try { - const version = currentAppVersion.value || metadataVersion.value + const version = metadataVersion.value.trim() || DEFAULT_METADATA_VERSION const remote = await fetchMetadataManifest({ baseUrl: metadataBaseUrl.value, version }) merged = { ...status, remote } } catch (error) { @@ -326,4 +326,3 @@ export const useAppStore = defineStore('app', () => { } }) -