Repository navigation
ells v0.2.4
ells v0.2.4
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.4 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.4"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.4] - 2026-10-19
修复
- Windows 自更新重启不再"看起来像闪退":更新换完二进制后,新版本是在同一个控制台里被拉
起来的 —— 旧进程一退出,外层 shell 立刻把提示符打回同一块屏幕,于是两个进程往同一个控制台写。
取证过:新进程根本没死(备用屏进得去、事件流读得到、Resize也收到了,只是尺寸是继承来的
80×24),但用户看到的只是提示符压着一片残片,就像程序自己闪退了。现在 Windows 用
CREATE_NEW_CONSOLE拉起新版本 —— 它从第一帧起独占一块自己的控制台,在 Windows Terminal 下
就是新开一个标签;旧标签交还给 shell 之后还会打印一句"新版本在默认终端的新标签/新窗口里打开",
免得那条空白被当成崩溃。对照实验里新控制台拿到的是真实尺寸Resize(133, 30)与FocusGained。 - macOS / Linux 上 0.2.3 完全起不来(
Error: The cursor position could not be read within a normal duration)修好了:0.2.3 为了让第一帧整屏重画,用的是ratatui::Terminal::clear()。
这个函数第一步是"问终端光标现在在哪" —— unix 上那是一发\x1b[6n写进 stdout 然后等回话,
而 ells 在第一次绘制之前就把 crossterm 的异步事件流跑起来了,tty 的读字节归它管:回话被事件流
吃掉,问的人只能等到超时,clear()?一路冒泡到main,程序在第一帧之前就退出。Windows 上
"问光标"走控制台 API、不发转义序列,所以只有 macOS / Linux 全废。现在整屏重画改用
terminal.resize(当前尺寸):Viewport::Fullscreen下它做的是同一套"清屏 + 作废差分基线",
但不问光标。残影那个问题依旧没有回归 —— 守卫脚本在真 pty 里断言三件事:一个\x1b[6n都不许
发、列表页真的画出内容、按q退出码为 0 且离开备用屏。 - 更新换完二进制却没留下退路,现在有了:起不来就自动退回上一版:以前只有 Windows 会把旧镜像
挪成.old(因为它不许删运行中的 exe),unix 上旧的直接没了 —— 新版万一首帧就崩,用户手里既没有
旧版本、也看不到报错,只剩一行Error:。现在 unix 同样先挪备份,替换成功后写一条"待验证"记录
(ells.update.pending,就放在二进制旁边),第一帧真的画到屏幕上才算确认、把备份和记录一起扔掉。
两条退路:带着未确认的记录又起不来 → 下次启动当场退回上一版并自动重新拉起;主循环带着错误退出
→ 当场退回再拉起。退回过的版本记进ells.update.rejected,检查更新时不再把它当成新版本推给用户
(否则会卡在"提示更新 → 装上 → 崩 → 退回 → 又提示更新")。没有备份时绝不挪走正在跑的二进制。 - 启动时把同目录的启动名修回安装脚本的形状,
ells能开、s打不开不会再出现:安装脚本在同一
个目录里放下两个名字(Windows 上是ells.exe+s.exe两份真拷贝,macOS / Linux 上s是指向
ells的软链),而自更新只换得动"正在跑的那一个",替换中途还可能把软链变成一份独立拷贝、或让
它悬空指向一个已经不存在的名字(命令还在 PATH 里,执行只报"没有那个文件")。现在每次界面启动都
先按安装脚本的形状核对同目录:断链重新指回、缺失的名字补上、内容不同的用正在跑的这份覆盖;正在跑
的本身、以及解析后是同一个文件的软链一律跳过(拷回自己 = 边截断边读同一个 inode,会把刚装好的
二进制写坏),被别的实例占用、覆盖不动的也只是记一条日志然后跳过,不算启动失败。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README