第02章:AI生成的依赖管理,上线后会爆炸吗?
第02章:AI生成的依赖管理,上线后会爆炸吗?
“每一个没有版本锁定的 requirements.txt,都是一颗等待时机的定时炸弹。”
ℹ️ 版本说明:本章基于 Python 3.14.5、uv 0.7.x 包管理器。命令示例以 uv 为主,同时提供 pip-tools 对照方案。
2.1 AI默认会生成什么
你让 AI 帮你写依赖管理,它通常会给你一个这样的 requirements.txt:
fastapi
uvicorn
sqlalchemy
redis
celery
pydantic
httpx
python-dotenv
或者稍微"好"一点,加了宽泛的版本约束:
fastapi>=0.100.0
uvicorn>=0.20.0
sqlalchemy>=2.0
redis>=5.0
这看起来很合理。问题是,在你写代码的这一天和你的代码跑在生产服务器的那一天之间,这些包可能已经发布了新版本。新版本可能有破坏性变更。而你的 >=0.100.0 会静静地把最新版装进去。
2.2 AI通常遗漏的4个坑
⚠️ 坑1:没有锁定文件,每次部署可能装不同版本
pip install -r requirements.txt 会装"满足约束的最新版"。
假设你开发时 fastapi 是 0.110.0,两个月后你重新部署,fastapi 已经是 0.115.0。它们之间有一个 breaking change:某个参数的默认值变了。你的测试在本地通过,但上线后 500 错误开始出现。
锁定文件的作用:记录每个包的精确版本(包括传递依赖),让每次安装都完全一致。就像 Node.js 的 package-lock.json、Rust 的 Cargo.lock。
AI 默认不会帮你生成锁定文件,因为生成锁定文件需要实际解析依赖树。
正确做法:使用 uv lock 生成 uv.lock,并将 uv.lock 提交到版本控制。
⚠️ 坑2:开发依赖和生产依赖没有分离
AI 生成的 requirements.txt 通常把所有依赖混在一起:
fastapi
pytest
black
mypy
sphinx
ipython
结果你的生产镜像装了 pytest、ipython、文档生成工具……不仅镜像体积增大,还扩大了攻击面(测试工具如果有漏洞,生产环境也被影响)。
正确做法:在 pyproject.toml 中区分 dependencies(生产依赖)和 [dependency-groups] 或 [project.optional-dependencies] 下的 dev(开发依赖)。
⚠️ 坑3:传递依赖冲突问题被忽略
你在 requirements.txt 里写了:
package-a>=1.0
package-b>=2.0
但你不知道 package-a 内部依赖 shared-lib==1.5,而 package-b 内部依赖 shared-lib>=2.0。这叫依赖地狱(dependency hell)。
pip 不会报错——它会静默地选择一个版本,但可能导致其中一个包功能异常。你只有在运行时才会发现。
正确做法:uv 在解析依赖时会检测冲突并报错,而不是静默地妥协。让 AI 帮你分析依赖冲突时,要求它使用 uv pip compile 或 uv tree 显示依赖树。
⚠️ 坑4:没有虚拟环境,污染全局 Python
AI 在给你写项目时,很少会主动提醒你:一定要用虚拟环境。初学者经常在全局 Python 环境里装了各种包,然后:
- 项目 A 需要
requests==2.28,项目 B 需要requests==2.31,两者无法共存 - 升级一个项目的依赖,把另一个项目搞坏了
- 三个月后完全不记得某个包是哪个项目装的
正确做法:每个项目一个虚拟环境。用 uv 的话,uv sync 会自动创建和管理虚拟环境,不需要手动 python -m venv。
2.3 更好的提示词
提示词 P01:用 uv 生成现代 Python 依赖管理
使用时机:初始化新项目或迁移现有项目的依赖管理
比默认多了什么:
- 生成 pyproject.toml 而非 requirements.txt
- 区分生产依赖和开发依赖
- 包含 uv.lock 的管理说明
- 包含 CI 环境中的最佳实践命令
为我的 Python 3.14 项目配置 uv 依赖管理。
我的项目依赖:
- 生产依赖:fastapi, uvicorn[standard], sqlalchemy[asyncio], asyncpg, pydantic, pydantic-settings, redis, httpx
- 开发依赖:pytest, pytest-asyncio, pytest-cov, ruff, mypy, httpx(用于测试)
要求:
1. 生成完整的 pyproject.toml,使用 [dependency-groups] 分离开发依赖
2. 说明运行 `uv lock` 后 uv.lock 应该提交到 git(不应该 gitignore)
3. 给出 CI 环境中的安装命令:`uv sync --frozen`(--frozen 确保严格遵循 lock 文件)
4. 给出生产环境只安装生产依赖的命令:`uv sync --no-dev`
5. 告诉我如何查看依赖树:`uv tree`
6. 告诉我如何检查是否有安全漏洞:`uv audit`(Python 3.14/uv 0.7 的新特性)
用 Python 3.14 + uv 0.7.x 的最新语法。
提示词 P02:迁移已有的 requirements.txt 到 pyproject.toml + uv.lock
使用时机:有一个历史项目用的是 requirements.txt,需要升级依赖管理
比默认多了什么:
- 识别并分离开发依赖
- 自动添加版本约束
- 保留原有依赖的同时升级到兼容的最新版
我有一个旧的 Python 项目,requirements.txt 内容如下:
[粘贴你的 requirements.txt 内容]
请帮我迁移到 pyproject.toml + uv 管理方案:
1. 分析哪些是生产依赖,哪些是开发/测试依赖(pytest、black、mypy、flake8等属于开发依赖)
2. 生成 pyproject.toml,requires-python = ">=3.14"
3. 对每个依赖,分析其当前版本和 Python 3.14 兼容的最低版本约束
4. 给出迁移步骤:
a. 安装 uv
b. 运行哪些命令完成迁移
c. 如何验证迁移成功(所有测试通过)
5. 警告我哪些包可能在 Python 3.14 下有兼容性问题
注意:Python 3.14 移除了一些废弃的 API,如 distutils,部分旧包可能不兼容。
提示词 P03:依赖安全扫描和漏洞修复
使用时机:定期维护或发布前的安全检查
比默认多了什么:
- 主动扫描已知 CVE 漏洞
- 提供升级路径
- 检查是否有废弃的包(已不再维护)
我的 Python 3.14 项目需要做上线前的依赖安全检查。
当前 pyproject.toml 依赖如下:
[粘贴 pyproject.toml 的 dependencies 部分]
请帮我:
1. 列出哪些包有已知的 CVE 安全漏洞(基于你的训练数据,标注可能已过时)
2. 对每个有漏洞的包,给出安全版本的最低要求
3. 检查是否有已停止维护(abandoned)的包,建议替代品
4. 生成 uv 升级命令,在不破坏 Python 3.14 兼容性的前提下升级到安全版本
同时告诉我如何设置 GitHub Dependabot 自动检测依赖漏洞。
注意:你的训练数据有截止日期,生产环境请用 `uv audit` 或 Safety / pip-audit 实时检查。
2.4 验收清单
| 检查项 | 验证方法 | AI辅助 |
|---|---|---|
| 使用 pyproject.toml 而非 requirements.txt | 根目录有 pyproject.toml,无裸 requirements.txt | 让 AI 生成迁移方案 |
| uv.lock 已提交到版本控制 | git status 中 uv.lock 被追踪 |
从 .gitignore 中移除 uv.lock |
| 生产依赖和开发依赖已分离 | pyproject.toml 中有 [dependency-groups] dev 组 | 让 AI 分析并分离依赖 |
CI 使用 --frozen 安装 |
CI 配置中包含 uv sync --frozen |
让 AI 帮你写 GitHub Actions workflow |
| 无已知安全漏洞 | 运行 uv audit 无高危漏洞 |
让 AI 分析并修复 |
| Python 版本已声明 | pyproject.toml 中有 requires-python |
使用 requires-python = ">=3.14" |
| 虚拟环境已隔离 | 每个项目有独立的 .venv |
运行 uv sync 自动创建 |
2.5 本章小结
如果你只记一件事:把 uv.lock 提交到版本控制,并在 CI 和生产部署时使用 uv sync --frozen。这一个习惯,能消灭 80% 的"在我机器上好好的"问题。
Python 3.14 时代的依赖管理三件套:
- uv:替代 pip + venv + pip-tools 的一站式工具,速度是 pip 的 10-100 倍
- pyproject.toml:统一的项目配置文件(PEP 517/518/621),替代 setup.py + requirements.txt
- uv.lock:精确的依赖锁定文件,确保所有环境完全一致
AI 能帮你生成依赖列表,但它不会帮你管理版本漂移、解析依赖冲突、扫描安全漏洞——这些需要你主动要求,并配合工具链来保障。
→ 第3章:AI写的异步代码,并发一高就挂?