第02章:AI生成的依赖管理,上线后会爆炸吗?

第02章:AI生成的依赖管理,上线后会爆炸吗?

“每一个没有版本锁定的 requirements.txt,都是一颗等待时机的定时炸弹。”


ℹ️ 版本说明:本章基于 Python 3.14.5uv 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 compileuv 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 时代的依赖管理三件套

  1. uv:替代 pip + venv + pip-tools 的一站式工具,速度是 pip 的 10-100 倍
  2. pyproject.toml:统一的项目配置文件(PEP 517/518/621),替代 setup.py + requirements.txt
  3. uv.lock:精确的依赖锁定文件,确保所有环境完全一致

AI 能帮你生成依赖列表,但它不会帮你管理版本漂移、解析依赖冲突、扫描安全漏洞——这些需要你主动要求,并配合工具链来保障。

→ 第3章:AI写的异步代码,并发一高就挂?