sqlite-utils 4.2.1 在 8 月 13 日发布,修复了上一版本的一个启动崩溃问题。用户通过 uvx sqlite-utils 直接调用时,程序会立刻报错退出。

根因很简单:4.2 版本里加了一行 from typing_extensions import Self,但开发者 Simon Willison 忘了把 typing-extensions 写进正式依赖列表。这不是 uv 的问题,也不是 uvx 的问题,是 sqlite-utils 自己的依赖清单没写全。

为什么开发机能跑,用户装不上

typing-extensions 没有凭空出现在 Simon 的电脑上。sqlite-utils 的开发依赖组(dev dependency group)里,有别的包间接把它带了进来。

Simon 在自己环境里测试 4.2 版本时,一切正常。问题在发布之后才暴露:uvx sqlite-utils 只安装正式依赖,不会带上开发依赖组。

环境依赖来源结果
Simon 本地开发环境正式依赖 + dev 依赖组(间接带上 typing-extensions)正常运行
uvx 直接启动只装正式依赖找不到 typing-extensions,崩溃

typing.Self 是 Python 3.11 才进标准库的特性。项目要兼容更早的 Python 版本,就得靠 typing-extensions 这个回退包提供同名功能。这个包平时很少被单独提起,出问题的概率也因此更容易被忽略。

这类坑在用 pyproject.toml 管依赖的项目里并不少见:本地环境往往比生产环境"更全",多装的包悄悄补上了缺失的声明,直到有人用更干净的方式安装,才会露馅。

谁该做什么,接下来看什么

普通用户不用做复杂排查。重新运行一次 uvx sqlite-utils --help,uvx 默认拉取最新版本,会自动用上 4.2.1。如果项目里固定了版本号(比如写死 sqlite-utils==4.2),需要手动改成 4.2.1,或者用 pip install -U sqlite-utils 更新。

对维护 Python 包的开发者,这次修复留下了一条更有用的东西:一条隔离冒烟测试命令。

Code
uv run --isolated --no-default-groups sqlite-utils --help

--no-default-groups 跳过默认的 dev 依赖组,--isolated 无视本地 .venv/ 里残留的额外包。两个参数叠加,等于模拟一个"什么都没多装"的干净环境——正是 uvx 用户实际面对的场景。

这次崩溃只影响直接干净安装启动 CLI 的场景,不涉及已安装环境里的核心功能,也没有证据显示涉及数据损坏或安全问题。接下来值得盯的,是这条隔离测试命令会不会被写进 sqlite-utils 的发布前检查清单,变成常规动作,而不是一次性补丁。

为什么开发机能跑,uvx直接崩 开发环境 安装 dev 依赖组 间接装上 typing-extensions 正常运行 本地测试全部通过 uvx 直接启动 只装正式依赖 typing-extensions 未声明 启动崩溃 import Self 找不到包