PAYATHON 2026

uv 的 workspace member 与 path dependency 有什么区别?

数据小陈

应该选择哪一种?

如果项目只需要依赖本地目录中的一个包,使用 path dependency 即可。如果多个包需要一起开发、统一解析依赖并共享锁文件,可以选择 workspace。是否位于同一个仓库也可以作为参考,更重要的是这些包是否需要统一管理。uv workspace 文档

两种配置有什么区别?

在原配置中,package_a 的来源由路径指定;package_b 被纳入 workspace 后,按包名从中查找。

比较项path dependencyworkspace member
配置含义指定依赖包的本地来源将项目纳入统一管理的 workspace
锁文件路径引用本身不会建立共享锁文件的关系所有成员共享根目录的 uv.lock
安装方式本地目录依赖默认采用非 editable 安装,可显式启用 editable默认采用 editable 安装
命令管理路径引用本身不提供成员选择能力可用 --package 选择成员

安装方式参见依赖来源文档,共享锁文件和成员命令参见 workspace 文档。

只需要本地依赖时,怎样配置?

先在调用方已有的 [project] 表中声明依赖,再在 [tool.uv.sources] 中指定来源。合并以下字段时,保留项目原有的其他配置:

[project]
dependencies = ["package_a"]

[tool.uv.sources]
package_a = { path = "python_stuff/package_a" }

如果希望修改本地包的 Python 源码后直接在环境中生效,可以启用 editable 安装:

[tool.uv.sources]
package_a = { path = "python_stuff/package_a", editable = true }

只需要 editable 安装时,无须创建 workspace。tool.uv.sources 用于指定来源,实际依赖仍需在相应的依赖字段中声明。uv 依赖管理文档

多个包需要一起管理时,怎样配置?

如果根项目依赖 package_b,可以在已有配置中补充:

[project]
dependencies = ["package_b"]

[tool.uv.sources]
package_b = { workspace = true }

[tool.uv.workspace]
members = ["python_stuff/package_b"]

python_stuff/package_b 必须包含自己的 pyproject.toml,其中声明的项目名称应与依赖名称对应。将成员加入 members,不会让根项目自动依赖该成员。uv workspace 配置说明

配置完成后,可以在 workspace 根目录运行:

# 为整个 workspace 解析并锁定依赖
uv lock

# 同步指定成员及其所需依赖
uv sync --package package_b

选择时要注意什么?

  • 多个包需要各自维护虚拟环境和锁文件时,通常更适合作为独立项目,并通过 path dependency 引用。
  • workspace 需要统一协调成员的依赖要求,不能用 --package 绕过整个 workspace 的依赖解析。
  • 改用 path dependency 也不会消除同一环境中的依赖冲突;调用方和本地依赖包的要求仍须兼容。

这些取舍与官方文档对 workspace 适用场景的说明一致。

默认的 editable 安装行为可以通过 uv sync --no-editable 关闭。源码修改能否直接生效也取决于修改内容,例如编译扩展通常仍需要重新构建。uv 安装与同步说明

备注:内容仅供参考。