poetry 默认将当前目录视为项目根,pyproject.toml 所在处即主包位置;monorepo 中需cd进子包目录或用--directory指定路径执行poetry add,否则依赖误写入顶层配置。

poetry add 为什么总装到 root 包而不是子包?
因为 Poetry 默认把当前目录当项目根,pyproject.toml 在哪,它就认为哪个是“主包”。monorepo 里多个 pyproject.toml 并存时,你 cd 进错目录、或者没指定 --directory,poetry add 就会往顶层的 pyproject.toml 写依赖。
实操建议:
立即学习“Python免费学习笔记(深入)”;
Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的
- 进子包目录再运行命令:
cd packages/my-utils && poetry add requests - 用
--directory显式指定路径:poetry add pytest --directory packages/my-api - 别在 monorepo 根目录下执行
poetry init或poetry add,除非你真想管理一个全局依赖池 - 检查当前是否误启用了 Poetry 的“virtualenvs.in-project = true”——这会让它在每个子目录建
.venv,但依赖仍可能写错位置
poetry install 后子包无法 import?
不是安装失败,是 Poetry 默认不启用“editable install”(即 -e 模式)。子包没被 pip 以开发模式链接进 site-packages,Python 找不到它们。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 对每个子包单独执行:
poetry install --no-root(先进入子包目录) - 或在子包
pyproject.toml中确保[tool.poetry.dependencies]下没漏掉python版本约束,否则poetry install可能跳过它 - 验证是否生效:运行
python -c "import my_utils; print(my_utils.__file__)",输出路径应指向你本地的packages/my-utils/my_utils/__init__.py,而非.venv/lib/... - 如果用 IDE(如 VS Code),重启 Python 解释器选择,它缓存了旧的 sys.path
如何让所有子包共享同一个虚拟环境?
Poetry 本身不支持“一个 venv 装多个独立 pyproject.toml”,但它允许你在根目录建一个“管理型”pyproject.toml,用 [tool.poetry.group.dev.dependencies] 和 [tool.poetry.group.test.dependencies] 统一管工具链,而各子包保持自己的依赖声明——关键在于不把子包当“依赖”硬塞进根项目。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 根目录
pyproject.toml只含 dev 工具(pytest,black,mypy),不声明任何业务包 - 各子包用
poetry add --group dev管理自己需要的 dev 工具,互不影响 - 运行测试时,cd 进子包目录再执行
poetry run pytest,它会自动用该子包的pyproject.toml解析依赖并激活对应环境 - 避免用
poetry workspace—— Poetry 官方已弃用该功能,且从未真正支持多包 workspace
用 hatch 或 pdm 替代 poetry?
可以,但切换前得看清差异点:hatch 默认支持 workspace(hatch build --all + hatch env run --all),pdm 支持 pdm worktree 管理多项目,而 Poetry 的“单项目单 lock”模型在 monorepo 场景下天然吃力。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 如果已有大量 Poetry 配置,先试
poetry-plugin-monorepo(第三方插件),它提供poetry monorepo lock等命令,比换工具成本低 - 新项目选 hatch:它的
pyproject.toml中[tool.hatch.envs]可为每个子包定义独立环境,且hatch run api:test自动匹配对应目录 - 注意 hatch 的
build默认不包含src/结构,若子包用src/my_pkg布局,需在[tool.hatch.build.targets.sdist]中配include = ["src/**"] - 别指望任何工具自动解决跨包类型提示(mypy 报
Module not resolved)——必须手动在每个子包的pyproject.toml里加[tool.mypy]+plugins = ["mypy_django"]类配置,或统一用pyrightconfig.json
PYTHONPATH 干扰、以及 pip list 看到的包和 python -m site 实际加载的路径不一致。









