用途
python-uv 技能用于指导使用 UV 进行 Python 依赖管理。资料指出,UV 是 Python 依赖管理的现代标准,提供确定性解析、相较 pip 10-100 倍的速度提升,以及内置虚拟环境管理。该技能适用于以下场景:搭建新的 Python 项目、管理 Python 依赖、运行 .py 文件与命令、运行 pytest 和 ruff 等 Python 工具、为 Python 应用创建 Dockerfile、Python 的 CI/CD 流水线,以及从 pip/poetry 迁移到 UV。
主要能力
资料给出的 UV 优势包括:确定性解析(锁文件保证精确版本)、内置虚拟环境管理、对 Docker 缓存友好(下载与安装阶段分离)、可直接替代 pip、跨平台锁文件。速度对比(20 个依赖,冷安装):pip install 为 120-180 秒,uv sync 为 15-20 秒(快 10 倍);使用缓存时:pip install(缓存)为 60-90 秒,uv sync(缓存)为 2-5 秒(快 30 倍)。
使用方式
项目初始化:uv init 创建新项目(生成 pyproject.toml);对已有 pyproject.toml 的项目运行 uv lock 从 pyproject.toml 生成 uv.lock。
日常开发:uv sync 安装全部依赖(创建/更新 venv);uv sync --no-dev 不安装开发依赖;uv add boto3>=1.40.0 添加运行时依赖;uv add --dev pytest>=8.0.0 添加开发依赖;uv remove boto3 移除依赖;uv lock --upgrade 更新锁文件(在约束内解析最新版本);uv run pytest tests/、uv run python -m myapp、uv run mypy src/ 在虚拟环境中运行命令。
锁文件管理:uv lock 生成/更新锁文件;uv lock --upgrade 将所有依赖更新到最新(在约束内);uv lock --upgrade-package boto3 更新指定包;uv lock --check 校验锁文件是否同步(CI 检查)。
Docker 集成:资料给出标准 Dockerfile 结构,从官方镜像复制 UV(COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv),先复制依赖文件以利用层缓存,使用缓存挂载 RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked uv sync --frozen,之后再复制源代码。资料强调 --frozen 纪律:开发(本地)使用 uv sync(若不同步可能更新 uv.lock);CI/Docker(生产)使用 uv sync --frozen(若 uv.lock 与 pyproject.toml 不匹配则失败)。在 Docker/CI 中使用 --frozen 的原因:确保锁文件已提交且最新、防止构建期间依赖静默变更、构建失败即表示锁文件漂移(有意的安全机制)、保证可复现构建。
多阶段构建:资料给出两阶段示例。阶段一 builder 安装全部依赖(含 dev),复制源码与测试,在构建期间运行测试 uv run pytest tests/,并构建 wheel uv build。阶段二 runtime 仅安装运行时依赖 uv sync --frozen --no-dev --no-install-project,从 builder 复制构建好的 wheel 并安装,设置 ENV PATH="/app/.venv/bin:$PATH" 与 ENTRYPOINT ["python", "-m", "myapp"]。
pyproject.toml 结构:资料给出 [project](name、version、description、requires-python、dependencies)、[project.optional-dependencies](dev 组含 pytest、mypy、ruff)、[build-system](hatchling)以及可选的 [tool.uv] 配置示例。
CI/CD 模式:GitHub Actions 使用 astral-sh/setup-uv@v1 安装 UV,然后 uv sync --frozen、uv run pytest tests/、uv run mypy src/。pre-commit 钩子示例使用本地 hook 执行 uv lock --check。
迁移:从 pip/requirements.txt 迁移的步骤为:创建含依赖的 pyproject.toml、运行 uv lock、运行 uv sync、删除 requirements.txt。从 poetry 迁移:UV 可读取 pyproject.toml(兼容 poetry 格式)、运行 uv lock 生成 uv.lock、运行 uv sync、可选删除 poetry.lock。私有包处理:uv add package --index-url https://private.pypi/simple/,或在 pyproject.toml 的 [tool.uv.sources] 中配置。
适用场景
资料建议:任何新的 Python 项目都应从 UV 开始;已有项目应迁移到 UV。何时仍用 pip?资料称很少,例外是无法安装 UV 的遗留系统。uv sync 与 uv sync --frozen 的选择:开发用 uv sync(灵活),CI/Docker 用 uv sync --frozen(严格)。
限制与反模式
资料列出的反模式包括:在新 Python 项目中使用 pip;在 Docker/CI 中不使用 --frozen(导致依赖静默漂移、构建不可复现);提交时不带 uv.lock(失去可复现性);手动管理 venv(python -m venv);在 UV 中使用 requirements.txt;将 uv.lock 加入 .gitignore。资料强调锁文件必须提交。uv.lock 包含每个依赖(含传递依赖)的精确版本、用于完整性校验的 SHA256 哈希、每个包的源 URL、平台特定解析结果,从而提供跨机器/时间的可复现构建、通过哈希进行篡改检测的安全性、可审计性以及版本验证。
与其他技能的集成
资料提到:version-pinning 用于约束策略(~= 与 >=);docker-multistage 与 UV 集成多阶段模式;version-currency 中 uv.lock 是版本验证的权威来源;container-boundary 中 UV venv 是容器本地而非宿主机。