Python Monorepo中uv sync未安装子包依赖的问题求助
问题背景
我正在使用uv作为依赖管理工具搭建Python Monorepo。在根目录执行uv sync时,仅安装了根包的依赖,所有子包的依赖均未被安装。
基于Python 3.12和uv构建数据平台Monorepo,项目包含以下组件:
- 核心库(
engine-core) - 数据流水线编排器(
orchestrator) - 数据建模用dbt项目(
dbt_forge)
项目结构
简化后的项目结构:
custom-data-forge/ ├── pyproject.toml └── packages/ ├── engine-core/ # Python library with importable modules │ └── pyproject.toml ├── orchestrator/ # Airflow DAGs and pipeline code │ └── pyproject.toml └── modeling/ └── dbt_forge/ # dbt models and ClickHouse transformations └── pyproject.toml
配置信息
根目录pyproject.toml:
[project] name = "custom-data-forge" version = "0.1.0" requires-python = ">=3.12" dependencies = ["pandas", "sqlalchemy", "tabulate"] [tool.uv.workspace] members = [ "packages/engine-core", "packages/orchestrator", "packages/modeling/dbt_forge", ]
子包pyproject.toml文件:
# packages/engine-core/pyproject.toml [project] name = "engine-core" version = "0.1.0" requires-python = ">=3.12" dependencies = ["dbt-core", "dbt-clickhouse"] # packages/orchestrator/pyproject.toml [project] name = "orchestrator" version = "0.1.0" requires-python = ">=3.12" dependencies = ["engine-core", "apache-airflow"] # packages/modeling/dbt_forge/pyproject.toml [project] name = "dbt_forge" version = "0.1.0" requires-python = ">=3.12" dependencies = ["dbt-core", "dbt-clickhouse"]
问题详情
在根目录执行uv sync时:
- 仅安装了根包的依赖(
pandas、sqlalchemy等) - 子包的依赖(
dbt-core、dbt-clickhouse、apache-airflow)均未安装
已尝试的解决方法
- 在子包的
pyproject.toml中添加[tool.uv] package = true - 验证根目录
pyproject.toml中的工作区配置 - 确保所有
[build-system]配置正确 - 删除
uv.lock后重新尝试
求助问题
- 这是uv工作区的预期行为吗?
uv sync不应安装所有工作区成员的依赖吗? - 如何正确配置uv以安装子包的依赖?
- 是否需要为子包添加
__init__.py使其成为“正式”Python包,uv才能识别?
环境信息
- Python 3.12
- uv 0.6.16
- Linux 5.15.167.4-microsoft-standard-WSL2
解答
1. 是否为预期行为?
不是。默认情况下uv sync仅安装当前包(根包)的依赖,不会自动包含工作区所有成员的依赖——除非明确指定同步所有工作区包,或把所有子包声明为根包的依赖。
2. 正确配置方法
有两种可行方案:
方案一:将子包添加为根包依赖
修改根目录pyproject.toml的dependencies节点,引入所有子包:
[project] # 保留原有配置 dependencies = [ "pandas", "sqlalchemy", "tabulate", "engine-core @ file://./packages/engine-core", "orchestrator @ file://./packages/orchestrator", "dbt_forge @ file://./packages/modeling/dbt_forge" ]
执行uv sync即可安装所有子包及其依赖。
方案二:使用--all参数同步所有工作区成员
直接在根目录执行命令:
uv sync --all
该命令会同步工作区所有成员的依赖,无需修改配置。
3. 是否需要添加__init__.py?
不需要。uv识别工作区成员的依据是目录下的pyproject.toml文件,只要存在合法的配置文件,即使没有__init__.py也会被视为工作区成员。但如果子包是需要被Python导入的库,添加__init__.py(或使用Python 3.3+的命名空间包)是规范做法,这和uv的识别逻辑无关。
内容的提问来源于stack exchange,提问作者Imad
相关产品推荐
相关产品推荐

