Skip to content

P1:从 dmg 直接运行时更新静默失败,且应用不会自动重启 #143

Description

@yujiezhang-ops

现象

从 dmg 里双击运行 OneAgent(没有拖进 /Applications),点击「重启并更新」后应用退出,然后不会重新打开。界面此前一路显示成功,退出后也没有任何错误提示。

根因

macOS 对从 dmg 或隔离位置运行的 app 做 App Translocation,把它挂载到一个随机只读路径:

/private/var/folders/.../AppTranslocation/79C329CB-B290-4966-9582-D0DD9AD6FB33/d/OneAgent.app

updater 的 helper 在替换前会先备份,而这个卷是只读的。实测日志($TMPDIR/wails-update-<pid>.log)有四次同样的记录:

helper start: target=/private/var/folders/.../AppTranslocation/.../d/OneAgent.app new=.../OneAgent-darwin-arm64.zip
backing up /private/var/folders/.../d/OneAgent.app → /private/var/folders/.../d/OneAgent.app.bak
backup failed: mkdir ....app.bak: read-only file system

关键问题在于失败之后的行为。 updater/helper.go:122 备份失败直接 return 12,而 restoreFromBackup 只挂在两个更晚的失败点上(swap 尝试耗尽、launch 失败)。备份失败发生在它们之前,所以这条路径既不恢复也不重新启动应用

用户视角:点了更新 → 应用消失 → 需要自己再打开一次。数据没有损坏,但没人告诉他发生了什么。

#139 的区别

#139 是选错资产(.dmg 覆盖 .app),会破坏安装,已在 v0.5.1 修复。

本 issue 是更新无法生效,安装本身完好。两者独立:v0.5.1 之后这个问题依然存在。

为什么用户会踩到

macOS 上从 dmg 直接运行是很常见的操作,尤其是我们的 dmg 目前没有任何拖拽引导(见 #TBD):打开后只有一个孤立的 app 图标,没有 /Applications 的软链接,用户不知道该把它放到哪里,双击是最自然的反应。

即便后来拖进了 /Applications,如果 quarantine 属性还在,也可能触发 translocation。

修复方向

1)启动时检测 translocation,并且不提供更新入口。 路径包含 /AppTranslocation/ 时,Check 应当直接返回「请先把 OneAgent 拖到应用程序文件夹」而不是提示新版本。在用户投入一次下载之前就说清楚,比事后解释更有价值。

2)验证目标路径可写,作为更通用的前置检查。 translocation 只是只读场景之一。

3)dmg 里加 /Applications 拖拽引导(见 #TBD),从源头降低触发概率。

4)失败后至少要把应用重新拉起来。 这条在框架代码里,需要向上游反馈:备份失败属于「什么都还没动」的状态,最适合直接重启原应用。

建议先做 1 和 3。

相关

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions