uv add --dev 能正确安装开发依赖,且比 poetry/pip-tools 更直接:它自动写入 pyproject.toml 的 [project.optional-dependencies.dev],作为一等公民参与依赖解析;uv sync 默认启用该组,无需额外文件,一致性由单一配置驱动。

uv add --dev 能否正确安装开发依赖
能,且比 poetry/pip-tools 更直接。uv 把 dev-dependencies 视为“依赖组(dependency group)”,不是额外文件或特殊标记,而是 pyproject.toml 中可声明、可命名、可独立操作的一等公民。
常见错误是误以为 uv add --dev 只是临时加包——它其实会自动写入 pyproject.toml 的 [project.optional-dependencies] 下的 dev 组,并在后续 uv sync 时默认启用该组。
- 执行
uv add --dev pytest black mypy后,pyproject.toml会新增或更新:
[project.optional-dependencies] dev = ["pytest", "black", "mypy"]
- 若项目尚未初始化
pyproject.toml,uv add --dev会先创建最小骨架文件(含[build-system]和[project]),再写入dev组 - 不推荐混用
uv add --dev和手动编辑requirements-dev.txt:uv 不读取后者,会导致uv sync时 dev 包缺失 -
--dev是默认行为;如需只装生产依赖,必须显式加--no-dev(例如 CI 构建时)
uv sync 默认是否包含 dev 依赖
是,默认包含。只要 pyproject.toml 里定义了 dev 组,且没加 --no-dev,uv sync 就会把该组所有包装进当前环境。
这和 pip + requirements.txt 的逻辑完全不同:后者靠人工维护多份文件,而 uv 把“是否启用某组”变成命令行开关,环境一致性由单一配置驱动。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
uv sync→ 安装[project.dependencies]+[project.optional-dependencies.dev] -
uv sync --no-dev→ 只装[project.dependencies],跳过所有 optional 组 -
uv sync --group test→ 若定义了test组,就只装它(不装dev或prod) - CI 中常用
uv sync --no-dev --python 3.12确保只装运行时依赖,避免测试工具污染生产镜像
从 requirements.txt 迁移 dev 依赖到 uv 的坑
不能直接用 uv pip install -r requirements-dev.txt 来“兼容过渡”——这条命令确实能装包,但不会写入 pyproject.toml,下次 uv sync 会删掉它们。
真正迁移 dev 依赖,必须走声明式路径:把包名提取出来,手工或脚本写入 [project.optional-dependencies.dev],再运行 uv sync。
- 错误做法:
uv pip install -r requirements-dev.txt && uv sync→ 第二步会清理掉 pip 安装的包 - 正确做法:删掉
requirements-dev.txt,改用uv add --dev pytest flake8 - 已有大量旧文件?可用脚本解析
requirements-dev.txt行,生成 TOML 片段,再合并进pyproject.toml - 注意 Windows 换行符和空行:uv 解析
pyproject.toml严格,非法格式会导致uv sync报错Failed to parse pyproject.toml
为什么 uv.lock 里 dev 依赖不单独隔离
因为 uv 不区分“dev vs prod”的锁文件,而是统一解析所有声明的依赖组,生成一份完整的 uv.lock。所有包(包括 dev 组)的精确版本、哈希、依赖树都记录其中。
这意味着:你本地 uv sync 和 CI 服务器上 uv sync --no-dev 用的是同一份锁文件,只是启用的子集不同——既保证复现性,又避免多份 lock 文件导致的漂移。
- 锁文件体积略大(含所有组),但解析速度不受影响
- 删除某个 dev 包后,
uv sync会自动从 lock 中剔除其子依赖(如果无其他组引用) - 不建议手动编辑
uv.lock:它由 uv 自动生成,结构复杂,手改极易破坏哈希校验
pyproject.toml,它就参与整个依赖解析过程——哪怕你当前没启用该组,它的约束也会影响其他包的可选版本范围。

















