本文档概述了 uv 为 Python 包管理提供支持的三个核心内部系统:依赖解析、包管理和缓存。这些系统协同工作,解析复杂的依赖图,从各种来源获取和构建包,并高效地缓存结果以提高性能。
有关命令行界面和面向用户的命令的信息,请参阅 命令行界面。有关项目特定操作的详细信息,请参阅 项目管理。
uv 的核心围绕三个相互关联的系统构建,这些系统处理 Python 包管理的复杂性。
来源:crates/uv-resolver/src/resolver/mod.rs101-104 crates/uv-distribution/src/distribution_database.rs50-55 crates/uv-client/src/registry_client.rs217-236 crates/uv-cache/src/lib.rs137-149
在包解析和安装期间,三个核心系统通过明确定义的接口进行交互。
来源:crates/uv-resolver/src/resolver/mod.rs275-307 crates/uv-client/src/registry_client.rs306-425 crates/uv-distribution/src/distribution_database.rs111-122 crates/uv-distribution/src/source/mod.rs106-253
依赖解析系统围绕 PubGrub 算法构建,并通过几个关键组件实现。
| 组件 | 目的 | 关键方法 |
|---|---|---|
Resolver<Provider> | 主要的解析协调器 | resolve(), solve() |
PubGrubPackage | PubGrub 中的包表示 | from_package(), name() |
PubGrubDependency | 依赖约束 | from_requirement() |
DefaultResolverProvider | 包元数据提供程序 | get_package_versions(), get_dependencies() |
解析器使用状态机方法,其中 ResolverState 维护当前的解析上下文,而 ForkState 处理用于通用解析的环境特定解析分支。
来源:crates/uv-resolver/src/resolver/mod.rs101-258 crates/uv-resolver/src/pubgrub/package.rs10-33 crates/uv-resolver/src/pubgrub/dependencies.rs17-26
包管理系统负责获取、构建和准备用于安装的包。
DistributionDatabase 作为中央协调器,使用 SourceDistributionBuilder 从源构建,并使用 ManagedClient 进行带并发控制的网络操作。
来源:crates/uv-distribution/src/distribution_database.rs50-88 crates/uv-distribution/src/source/mod.rs60-104 crates/uv-client/src/registry_client.rs217-236
缓存系统提供跨 uv 操作的持久存储,并组织成逻辑桶。
| 存储桶 | 目的 | 内容 |
|---|---|---|
CacheBucket::Simple | Simple API 的包元数据 | PackageName.rkyv 文件 |
CacheBucket::Wheels | 预构建的 wheel 分发包 | 提取的 wheel 目录 |
CacheBucket::SourceDistributions | 从源构建的 wheel 包 | 源存档和构建的 wheel 包 |
CacheBucket::Archive | 内容寻址存储 | wheel 的符号链接目标 |
CacheBucket::Environments | 虚拟环境 | 临时 Python 环境 |
缓存使用 CacheShard 来组织相关条目,并使用 CacheEntry 来管理单个缓存项,支持原子操作和垃圾回收。
来源:crates/uv-cache/src/lib.rs137-216 crates/uv-cache/src/lib.rs39-87 crates/uv-cache/src/lib.rs95-135
三个核心系统通过几个关键接口进行集成。
解析器通过分发数据库驱动包获取,该数据库与注册表客户端和缓存系统进行协调。BatchPrefetcher 通过预取可能需要的包元数据来优化网络请求,而 InMemoryIndex 提供对包版本信息的快速访问。
缓存系统通过智能缓存键生成以及使用时间戳和内容哈希进行新鲜度验证,确保了源构建和网络请求等耗时操作的最小化。
来源:crates/uv-resolver/src/resolver/batch_prefetch.rs45-80 crates/uv-resolver/src/resolver/index.rs crates/uv-cache/src/lib.rs244-284