现象
从 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 是选错资产(.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。
相关
现象
从 dmg 里双击运行 OneAgent(没有拖进
/Applications),点击「重启并更新」后应用退出,然后不会重新打开。界面此前一路显示成功,退出后也没有任何错误提示。根因
macOS 对从 dmg 或隔离位置运行的 app 做 App Translocation,把它挂载到一个随机只读路径:
updater 的 helper 在替换前会先备份,而这个卷是只读的。实测日志(
$TMPDIR/wails-update-<pid>.log)有四次同样的记录:关键问题在于失败之后的行为。
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。
相关