You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后重新尝试
求助问题
  1. 这是uv工作区的预期行为吗?uv sync不应安装所有工作区成员的依赖吗?
  2. 如何正确配置uv以安装子包的依赖?
  3. 是否需要为子包添加__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:58:27