本文档涵盖了 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