Merge branch 'dev' into dev

This commit is contained in:
xuncha
2026-04-03 20:08:03 +08:00
committed by GitHub
4 changed files with 48 additions and 17 deletions

View File

@@ -38,18 +38,28 @@ autoUpdater.autoInstallOnAppQuit = true
autoUpdater.disableDifferentialDownload = true // 禁用差分更新,强制全量下载
// 更新通道策略:
// - 稳定版(如 4.3.0)默认走 latest
// - 预览版(如 4.3.0-preview.26.1)默认走 preview
// - 开发版(如 4.3.0-dev.26.3.4)默认走 dev
// - 预览版(如 0.26.2)默认走 preview0.年.当年发布序号)
// - 开发版(如 26.4.5)默认走 dev(年.月.日)
// - 用户可在设置页切换稳定/预览/开发,切换后即时生效
// 同时区分 Windows x64 / arm64避免更新清单互相覆盖。
const appVersion = app.getVersion()
const inferUpdateTrackFromVersion = (version: string): 'stable' | 'preview' | 'dev' => {
const normalized = String(version || '').trim().replace(/^v/i, '')
if (/^0\.\d{2}\.\d+$/i.test(normalized)) return 'preview'
if (/^\d{2}\.\d{1,2}\.\d{1,2}$/i.test(normalized)) return 'dev'
// 兼容旧版命名(如 4.3.0-preview.26.1 / 4.3.0-dev.26.3.4
if (/-preview\.\d+\.\d+$/i.test(normalized)) return 'preview'
if (/-dev\.\d+\.\d+\.\d+$/i.test(normalized)) return 'dev'
// 兼容 alpha/beta/rc 预发布
if (/(alpha|beta|rc)/i.test(normalized)) return 'dev'
return 'stable'
}
const defaultUpdateTrack: 'stable' | 'preview' | 'dev' = (() => {
if (/-preview\.\d+\.\d+$/i.test(appVersion)) return 'preview'
if (/-dev\.\d+\.\d+\.\d+$/i.test(appVersion)) return 'dev'
if (/(alpha|beta|rc)/i.test(appVersion)) return 'dev'
const inferred = inferUpdateTrackFromVersion(appVersion)
if (inferred === 'preview' || inferred === 'dev') return inferred
return 'stable'
})()
const isPrereleaseBuild = defaultUpdateTrack !== 'stable'
let configService: ConfigService | null = null
const normalizeUpdateTrack = (raw: unknown): 'stable' | 'preview' | 'dev' | null => {
@@ -116,16 +126,27 @@ const isRemoteVersionNewer = (latestVersion: string, currentVersion: string): bo
}
}
const shouldOfferUpdateForTrack = (latestVersion: string, currentVersion: string): boolean => {
if (isRemoteVersionNewer(latestVersion, currentVersion)) return true
const effectiveTrack = getEffectiveUpdateTrack()
const currentTrack = inferUpdateTrackFromVersion(currentVersion)
// 切换通道后,目标通道最新版本与当前版本不同即提示更新(即使是降级)
if (effectiveTrack !== currentTrack && latestVersion !== currentVersion) return true
return false
}
const applyAutoUpdateChannel = (reason: 'startup' | 'settings' = 'startup') => {
const track = getEffectiveUpdateTrack()
const currentTrack = inferUpdateTrackFromVersion(appVersion)
const baseUpdateChannel = track === 'stable' ? 'latest' : track
autoUpdater.allowPrerelease = track !== 'stable'
autoUpdater.allowDowngrade = isPrereleaseBuild && track === 'stable'
// 只要用户当前选择的目标通道与当前安装版本所属通道不同,就允许跨通道更新(含降级)
autoUpdater.allowDowngrade = track !== currentTrack
autoUpdater.channel =
process.platform === 'win32' && process.arch === 'arm64'
? `${baseUpdateChannel}-arm64`
: baseUpdateChannel
console.log(`[Update](${reason}) 当前版本 ${appVersion},渠道偏好: ${track},更新通道: ${autoUpdater.channel}`)
console.log(`[Update](${reason}) 当前版本 ${appVersion}当前轨道: ${currentTrack}渠道偏好: ${track},更新通道: ${autoUpdater.channel}allowDowngrade=${autoUpdater.allowDowngrade}`)
}
applyAutoUpdateChannel('startup')
@@ -1338,7 +1359,7 @@ function registerIpcHandlers() {
if (result && result.updateInfo) {
const currentVersion = app.getVersion()
const latestVersion = result.updateInfo.version
if (isRemoteVersionNewer(latestVersion, currentVersion)) {
if (shouldOfferUpdateForTrack(latestVersion, currentVersion)) {
return {
hasUpdate: true,
version: latestVersion,
@@ -2796,7 +2817,7 @@ function checkForUpdatesOnStartup() {
const latestVersion = result.updateInfo.version
// 检查是否有新版本
if (isRemoteVersionNewer(latestVersion, currentVersion) && mainWindow) {
if (shouldOfferUpdateForTrack(latestVersion, currentVersion) && mainWindow) {
// 检查该版本是否被用户忽略
const ignoredVersion = configService?.get('ignoredUpdateVersion')
if (ignoredVersion === latestVersion) {