菜单

锁文件生成

相关源文件

本文档涵盖了 uv 的锁文件生成系统,该系统会创建和维护 uv.lock 文件,以确保可复现的依赖解析。锁文件包含 Python 项目和 PEP 723 脚本的已解析包版本、元数据和依赖关系。

有关安装过程中锁文件的使用信息,请参阅 包管理。有关工作区级别的依赖管理,请参阅 工作区

概述

锁文件生成系统以 TOML 格式生成 uv.lock 文件,这些文件捕获项目或脚本的完整依赖图。该系统支持基于工作区的项目和独立的 PEP 723 脚本,具有不同的锁目标和操作模式。

锁文件生成流程

来源: crates/uv/src/commands/project/lock.rs78-236 crates/uv/src/commands/project/add.rs97-278 crates/uv/src/commands/project/sync.rs51-77

锁数据结构

核心锁文件由 Lock 结构表示,其中包含已解析的包、元数据和配置选项。锁文件使用版本化格式,以确保跨 uv 版本的兼容性。

锁结构组件

锁文件格式使用版本 1,修订版为 2,其中版本更改表示不兼容性,修订版更改向后兼容。

来源: crates/uv-resolver/src/lock/mod.rs111-158 crates/uv-resolver/src/lock/mod.rs74-77

锁操作流程

锁操作由 LockOperation 结构协调,该结构处理不同的锁模式和目标。操作会解析依赖项,然后将锁文件写入磁盘或根据现有锁进行验证。

锁操作类关系

execute() 方法根据指定的模式协调整个锁操作。

模式行为
写入执行解析并将锁文件写入磁盘
DryRun(试运行)执行解析但不写入锁文件
Locked(已锁定)验证现有锁文件是否符合当前需求
Frozen(冻结)使用现有锁文件,无需解析

来源: crates/uv/src/commands/project/lock.rs238-248 crates/uv/src/commands/project/lock.rs250-289 crates/uv/src/commands/project/lock.rs302-384

锁目标

该系统通过 LockTarget 枚举支持两个主要锁目标:基于工作区的项目和 PEP 723 脚本。每个目标提供不同的元数据和要求。

锁目标实现

工作区目标从 pyproject.toml 文件读取,并支持多个包,而脚本目标则从 PEP 723 内联元数据块中提取需求。

来源: crates/uv/src/commands/project/lock_target.rs15-31 crates/uv/src/commands/project/lock_target.rs134-276

锁生成算法

核心锁生成发生在 do_lock() 函数中,该函数协调依赖解析,并根据解析输出创建最终的 Lock 结构。

解析过程会处理用于跨平台兼容性的通用标记,并根据环境约束移除无法访问的 wheel。

来源: crates/uv/src/commands/project/lock.rs388-401 crates/uv-resolver/src/lock/mod.rs161-302 crates/uv-resolver/src/lock/mod.rs308-372

与命令的集成

多个 uv 命令与锁文件生成系统集成,每个命令都有特定的锁管理要求和行为。

命令集成模式

每个命令根据 --locked--frozen--dry-run 等标志来确定适当的锁模式。

命令默认模式特殊处理
uv lock写入支持 --locked 进行验证
uv add写入始终更新锁文件
uv sync写入可以使用 --frozen 跳过解析
uv run写入对于没有锁文件的脚本,可能会跳过锁定

来源: crates/uv/src/commands/project/add.rs451-577 crates/uv/src/commands/project/sync.rs687-695 crates/uv/src/commands/project/run.rs242-249

锁文件验证与更新

该系统提供机制来验证锁文件是否符合当前要求,并检测何时需要更新。 LockResult 枚举指示锁文件在操作期间是未更改还是已更改。

锁文件验证可确保可重现的构建,通过检测依赖项何时发生更改以及锁文件何时需要更新。

来源: crates/uv/src/commands/project/lock.rs51-75 crates/uv/src/commands/project/lock.rs336-341 crates/uv/src/commands/project/mod.rs75-82