Skip to content

PEP-621 static dependencies lose develop = true on transitive dependencies #10683

@StuartBertram

Description

@StuartBertram

Description

I have a form of monorepo - one repo containing multiple directories, each of which has its own Poetry config. Some of these packages depend on other packages in other sub-directories. Sometimes those chains can be three and four levels deep.

With the old pre-PEP-621 tool.poetry format in pyproject.toml then the develop flag persists into the lock file regardless of the depth of the chain. With a newer PEP-621 project format with the dependency defined in project.dependencies and the extra develop=true metadata set in tool.poetry.dependencies then the develop = true value is only retained for the directly referenced project and the transitive dependency loses its flag and goes back to develop = false.

This doesn't seem to cause issues while developing (e.g. running PyTest) because the site-packages uses a .pth file and so loads the current files. But it does cause issues during packaging and deployment (e.g. Serverless publishing to AWS) because the packaging process has cached the transitive dependency (because it's develop = false) and doesn't include any newer changes.

For example, given the projects base, lib and service with a dependency chain of service depends on lib and lib depends on base, where lib and service both add develop = true metadata to the dependency then the poetry.lock file for lib has develop = true on base and service has develop = true on lib, but service has develop = false on the transitive dependency to base and so won't include any changes made within the base project.

Comparative "new" and "old" format structures: poetry-bug.zip

Git-style diff between the two folders:

diff -Naur old-format/base/poetry.lock new-format/base/poetry.lock
--- old-format/base/poetry.lock 2026-01-08 14:24:13.102219878 +0000
+++ new-format/base/poetry.lock 2026-01-08 13:53:27.263624844 +0000
@@ -4,4 +4,4 @@
 [metadata]
 lock-version = "2.1"
 python-versions = ">=3.14"
-content-hash = "93de2bb2d66318c60f5f9a4b648ffe8bb54e5083b54f259834eb309d0214bd01"
+content-hash = "a17e7643ed4aefa81470391aa6cad48a796709c4f4bc8d4f3c99db84a3c428dd"
diff -Naur old-format/base/pyproject.toml new-format/base/pyproject.toml
--- old-format/base/pyproject.toml      2026-01-08 14:31:41.184379664 +0000
+++ new-format/base/pyproject.toml      2026-01-08 14:31:26.459476540 +0000
@@ -1,15 +1,14 @@
-[tool.poetry]
+[project]
 name = "base"
 version = "0.1.0"
 description = ""
 authors = [
-    "Your Name <[email protected]>"
+    {name = "Your Name",email = "[email protected]"}
 ]
 readme = "README.md"
-
-[tool.poetry.dependencies]
-python = ">=3.14"
-
+requires-python = ">=3.14"
+dependencies = [
+]
 
 [build-system]
 requires = ["poetry-core>=2.0.0,<3.0.0"]
diff -Naur old-format/lib/poetry.lock new-format/lib/poetry.lock
--- old-format/lib/poetry.lock  2026-01-08 14:28:02.893520718 +0000
+++ new-format/lib/poetry.lock  2026-01-08 13:53:27.271598654 +0000
@@ -17,4 +17,4 @@
 [metadata]
 lock-version = "2.1"
 python-versions = ">=3.14"
-content-hash = "ca97d18604dbe204d15864ccdfe479d491b1f91c121f85926a4964ca34d2fbf2"
+content-hash = "a7a987130a2aed489d429f4703948023dcf76d32148b58851c1fdfdb6a6f5aa5"
diff -Naur old-format/lib/pyproject.toml new-format/lib/pyproject.toml
--- old-format/lib/pyproject.toml       2026-01-08 14:27:51.621315144 +0000
+++ new-format/lib/pyproject.toml       2026-01-08 15:32:49.782545948 +0000
@@ -1,17 +1,19 @@
-[tool.poetry]
+[project]
 name = "lib"
 version = "0.1.0"
 description = ""
 authors = [
-    "Your Name <[email protected]>"
+    {name = "Your Name",email = "[email protected]"}
 ]
 readme = "README.md"
+requires-python = ">=3.14"
+dependencies = [
+    "base @ ../base"
+]
 
 [tool.poetry.dependencies]
-python = ">=3.14"
-base = { path = "../base", develop = true }
+base = { develop = true }
 
 [build-system]
 requires = ["poetry-core>=2.0.0,<3.0.0"]
 build-backend = "poetry.core.masonry.api"
-
diff -Naur old-format/service/poetry.lock new-format/service/poetry.lock
--- old-format/service/poetry.lock      2026-01-08 14:29:17.109423780 +0000
+++ new-format/service/poetry.lock      2026-01-08 15:33:13.015370439 +0000
@@ -8,7 +8,7 @@
 python-versions = ">=3.14"
 groups = ["main"]
 files = []
-develop = true
+develop = false
 
 [package.source]
 type = "directory"
@@ -25,7 +25,7 @@
 develop = true
 
 [package.dependencies]
-base = {path = "../base", develop = true}
+base = {path = "../base"}
 
 [package.source]
 type = "directory"
@@ -34,4 +34,4 @@
 [metadata]
 lock-version = "2.1"
 python-versions = ">=3.14"
-content-hash = "1b127ecc24d022cbfecf9e41fceb18f14bd479f937070f12fe08899bdcf8b820"
+content-hash = "5932f53d95c41fda537a7746fb78b8c4164d54820271877b9b8f8bd702c8ac2f"
diff -Naur old-format/service/pyproject.toml new-format/service/pyproject.toml
--- old-format/service/pyproject.toml   2026-01-08 14:29:10.685377762 +0000
+++ new-format/service/pyproject.toml   2026-01-08 15:32:46.577867184 +0000
@@ -1,15 +1,18 @@
-[tool.poetry]
+[project]
 name = "service"
 version = "0.1.0"
 description = ""
 authors = [
-    "Your Name <[email protected]>"
+    {name = "Your Name",email = "[email protected]"}
 ]
 readme = "README.md"
+requires-python = ">=3.14"
+dependencies = [
+    "lib @ ../lib"
+]
 
 [tool.poetry.dependencies]
-python = ">=3.14"
-lib = { path = "../lib", develop = true }
+lib = { develop = true }
 
 [build-system]
 requires = ["poetry-core>=2.0.0,<3.0.0"]

(Notice the changes in service/poetry.lock)

Workarounds

Keeping a pre-PEP-621 or PEP-621 dynamic setup without project.dependencies and still specify everything in tool.poetry.dependencies retains the old behaviour.

Duplicating the path in tool.poetry.dependencies definition (not just develop = true) doesn't appear to work.

Adding a develop=true dependency into tool.poetry.dependencies for every transitive dependency without specifying it in project.dependencies isn't scalable and doesn't seem to work.

Duplicating the transitive dependencies and putting them into tool.poetry.dependencies in the dependent project does appear to work but isn't scalable.

Poetry Installation Method

install.python-poetry.org

Operating System

Ubuntu 24.04 in WSL

Poetry Version

Poetry (version 2.2.1)

Poetry Configuration

cache-dir = "/home/sjbertram/.cache/pypoetry"
data-dir = "/home/sjbertram/.local/share/pypoetry"
installer.max-workers = null
installer.no-binary = null
installer.only-binary = null
installer.parallel = true
installer.re-resolve = true
keyring.enabled = true
python.installation-dir = "{data-dir}/python"  # /home/sjbertram/.local/share/pypoetry/python
requests.max-retries = 0
solver.lazy-wheel = true
system-git-client = false
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}/virtualenvs"  # /home/sjbertram/.cache/pypoetry/virtualenvs
virtualenvs.prompt = "{project_name}-py{python_version}"
virtualenvs.use-poetry-python = false

Python Sysconfig

sysconfig.log
Paste the output of 'python -m sysconfig', over this line.

Example pyproject.toml

See attachment in description - requires multiple config files

Poetry Runtime Logs

N/A

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugSomething isn't working as expectedstatus/triageThis issue needs to be triaged

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions