十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

uv pip 包管理详解:安装、可编辑安装、文件来源与卸载的完整实践

uv pip 包管理详解:安装、可编辑安装、文件来源与卸载的完整实践 uv pip 包管理详解安装、可编辑安装、文件来源与卸载的完整实践【免费下载链接】uvAn extremely fast Python package and project manager, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/uv/uv本文基于 uv 仓库官方文档docs/pip/packages.md整理并深入源码系统讲解uv pip install/uv pip uninstall的完整用法从 PyPI 安装、extras 与版本约束、本地路径与 Git 仓库安装到requirements.txt/pyproject.toml/ 依赖组等文件来源以及可编辑editable安装的语义。读完后你可以把 uv 作为 pip 的直接替代来管理虚拟环境中的包并理解 uv 在安装前后做了哪些环境检查与优化。1. 安装一个包将包安装到当前虚拟环境最基础的用法是以 Flask 为例$ uv pip install flask启用可选依赖extra安装例如给 Flask 加上 dotenv extra$ uv pip install flask[dotenv]一次安装多个包例如同时安装 Flask 和 Ruff$ uv pip install flask ruff带版本约束安装例如 Ruff v0.2.0 或更新版本$ uv pip install ruff0.2.0锁定到特定版本例如 Ruff v0.3.0$ uv pip install ruff0.3.0以上形式全部由uv-requirements中的统一模型处理。在 RequirementsSource 枚举定义 中可以看到命令行直接给出的包名对应RequirementsSource::Package变体“A package was provided on the command line, e.g.,pip install flask”而-e安装路径则对应RequirementsSource::Editable。extras 的写法flask[dotenv]和版本约束、遵循 PEP 508 / PEP 440 语法解析后进入同一个解析器流程因此“命令行安装”与“文件安装”在 uv 内部走的是同一条安装链路。2. 从本地磁盘与 Git 仓库安装从磁盘目录安装指向一个包含可构建包的本地目录$ uv pip install ruff ./projects/ruff这种name path的写法会被解析为目录类型的源码分发包Directory Source Distribution。从 Resolution 与 ResolvedDist 的类型定义 可以看出uv 在解析结果中保留了install_path、editable标志等信息这正是磁盘目录安装、可编辑安装能共存的基础。从 GitHub 安装$ uv pip install githttps://github.com/astral-sh/ruff也可以指定具体的 Git 引用标签、提交、分支$ # 安装某个 tag $ uv pip install githttps://github.com/astral-sh/ruffv0.2.0 $ # 安装某个 commit $ uv pip install githttps://github.com/astral-sh/ruff1fadefa67b26508cc59cf38e6130bde2243c929d $ # 安装某个分支 $ uv pip install githttps://github.com/astral-sh/ruffmain如需从私有 Git 仓库安装需要配置 Git 认证参见仓库内的 Git 认证文档。uv 的 Git 拉取逻辑集中在uv-gitcratecrates/uv-git认证凭据则通过uv-auth提供的认证链解析。3. 可编辑editable安装可编辑安装的核心价值是修改包源码后无需重新安装即可生效。安装当前项目为可编辑包$ uv pip install -e .把其他目录下的项目作为可编辑包安装$ uv pip install -e ruff ./project/ruff在源码层面可编辑标志并不是在构建阶段临时处理的。pip_install 主流程 在完成依赖解析后会调用 apply_editable_mode 对解析结果做一次映射它遍历Resolution中的每个ResolvedDist把目录类型的DirectorySourceDist的editable字段改写为目标模式。也就是说-e最终落实为解析图中每个本地目录分布的一个持久标志构建后端PEP 660 流程据此生成可编辑包装器而非拷贝代码——这就是“改源码即时生效”的实现基础。4. 从文件安装除了命令行直接给包名uv 还支持从标准文件格式一次安装多个包。从 requirements.txt 安装$ uv pip install -r requirements.txtrequirements.txt的解析实现在 uv-requirements-txt crate并附带完整的快照测试crates/uv-requirements-txt/src/snapshots/。更多requirements.txt的编写规范可参考uv pip compile文档。值得注意的一点是uv 不只识别requirements.txt这一种文件。RequirementsSource::from_requirements_file 按文件扩展名分派来源类型pyproject.toml→PyprojectToml、setup.py→SetupPy、setup.cfg→SetupCfg、.py/.pyw文件 → PEP 723 脚本、*.toml如pylock.toml→ 锁文件、无扩展名文件则按内容嗅探。因此-r参数实际上覆盖了 uv 支持的全部需求来源。从 pyproject.toml 安装$ uv pip install -r pyproject.toml启用某个可选依赖extra foo$ uv pip install -r pyproject.toml --extra foo启用全部可选依赖$ uv pip install -r pyproject.toml --all-extras安装依赖组dependency groups安装当前项目目录下pyproject.toml中定义的依赖组例如组foo$ uv pip install --group foo指定组来源的项目目录$ uv pip install --project some/path/ --group foo --group bar也可以为每个组直接指定pyproject.toml路径$ uv pip install --group some/path/pyproject.toml:foo --group other/pyproject.toml:bar!!! 注意 !!!与 pip 的行为一致--group 标志**不适用于**通过 -r、-e 等标志指定的其他来源。例如 uv pip install -r some/path/pyproject.toml --group foo 中的 foo 组取自 ./pyproject.toml当前目录而**不是** some/path/pyproject.toml。依赖组的规范模型见 [uv-configuration 中的 GroupsSpecification](https://link.gitcode.com/i/cf6b0c0a79da2490674165eb25719b4b)在 [pip_install](https://link.gitcode.com/i/2076f55ac7fc780abd0e472c05cf3942) 中它作为 groups 参数传入 operations::read_requirements 统一归并。5. 卸载包卸载单个包例如 Flask$ uv pip uninstall flask一次卸载多个包例如 Flask 和 Ruff$ uv pip uninstall flask ruff卸载的实现在 pip_uninstall它同样先把参数读成RequirementsSpecification因此卸载名与 pip 一样忽略版本说明符——源码注释明确说明“Likepip, we ignore the dependency specifier (even if its a URL)”然后对当前环境的site-packages建索引并匹配移除。6. uv 在装/卸包前后做了什么源码视角理解 pip_install 主流程 的参数列表和关键步骤能解释 uv 相比 pip 更“安全”的几个默认行为统一读取需求来源。operations::read_requirements把命令行包名、-r文件、约束-c、覆盖overrides、依赖组等全部归一化为RequirementsSpecificationcrates/uv/src/commands/pip/install.rs#L140-L168。环境发现。通过PythonEnvironment::find定位解释器默认在当前VIRTUAL_ENV/.venv中查找--system才使用系统解释器--target、--prefix会进一步把安装根目录重定向install.rs#L211-L265。外部管理环境拦截。若解释器标记为 externally managedPEP 668uv 会直接报错并提示用uv venv创建虚拟环境只有显式传--break-system-packages才继续install.rs#L267-L291ExternallyManagedError 定义 还针对--system给出不同的排查提示。卸载流程有同样的检查。环境锁。写入前先environment.lock()install.rs#L293-L299避免并发安装互相破坏 site-packages。快速满足性检查。在启动完整解析器之前uv 先用SitePackages::satisfies_spec验证当前环境是否已满足需求install.rs#L328-L387。源码注释给出了动机“for large environments, its an order of magnitude faster to validate the environment than to resolve the requirements”——这就是重复执行uv pip install flask时几乎瞬时返回的机制。解析 安装。不满足时才调用operations::resolve走完整解析器含约束、覆盖、extras、groups、哈希校验、index 位置合并随后operations::install把解析图同步到环境并在--strict时对环境做额外诊断install.rs#L570-L705。这条“先校验、后解析、再同步”的流水线也是uv pip sync、uv pip install --upgrade等命令共用的骨架统一定义在 crates/uv/src/commands/pip/operations.rs。7. 适用前提与限制以上命令属于 uv 的pip 兼容接口uv pip子命令族操作目标是已存在的虚拟环境或系统解释器uv 默认优先使用已激活的环境或项目下的.venv不会自动创建环境——创建请用uv venv。在受外部管理externally managed的解释器上不带--break-system-packages的安装/卸载会失败这是 PEP 668 的强制要求。--group的“组来源只取当前项目/--project指定目录”的限制见第 4 节注意框来自与 pip 的兼容约定跨目录混装时需显式使用--project或path/pyproject.toml:group写法。本文行为描述以当前仓库的 Rust 源码crates/uv/src/commands/pip/目录为准requirements.txt中索引相关选项--index-url、--find-links等的语义与 pip 基本一致详见 docs/pip/indexes.md 相关说明。参考文件docs/pip/packages.md —— 本文对应的官方文档原文crates/uv/src/commands/pip/install.rs ——uv pip install主流程crates/uv/src/commands/pip/uninstall.rs ——uv pip uninstall主流程crates/uv/src/commands/editable.rs —— 可编辑模式在解析结果上的落实crates/uv-requirements/src/sources.rs —— 需求来源类型与文件分派crates/uv-requirements-txt/src/lib.rs ——requirements.txt解析【免费下载链接】uvAn extremely fast Python package and project manager, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/uv/uv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表