uv 的 workspace member 与 path dependency 有什么区别?
数据小陈
应该选择哪一种?
如果项目只需要依赖本地目录中的一个包,使用 path dependency 即可。如果多个包需要一起开发、统一解析依赖并共享锁文件,可以选择 workspace。是否位于同一个仓库也可以作为参考,更重要的是这些包是否需要统一管理。uv workspace 文档
两种配置有什么区别?
在原配置中,package_a 的来源由路径指定;package_b 被纳入 workspace 后,按包名从中查找。
| 比较项 | path dependency | workspace 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 安装与同步说明
备注:内容仅供参考。
