|
5 | 5 | from typing import ClassVar |
6 | 6 |
|
7 | 7 | from cleo.helpers import option |
| 8 | +from poetry.core.packages.dependency_group import MAIN_GROUP |
| 9 | +from poetry.core.version.markers import MultiMarker |
| 10 | +from poetry.core.version.markers import parse_marker |
8 | 11 |
|
9 | 12 | from poetry.console.commands.env_command import EnvCommand |
10 | 13 | from poetry.utils.env import build_environment |
@@ -68,8 +71,30 @@ def _build( |
68 | 71 | local=local_version_label |
69 | 72 | ) |
70 | 73 |
|
71 | | - for builder in builders: |
72 | | - builder(self.poetry, executable=executable).build(target_dir) |
| 74 | + if not self.poetry.locker.is_locked_groups_and_markers(): |
| 75 | + raise RuntimeError("lock file version too old") |
| 76 | + for package, info in self.poetry.locker.locked_packages().items(): |
| 77 | + if MAIN_GROUP not in info.groups: |
| 78 | + continue |
| 79 | + package.optional = True |
| 80 | + dependency = package.to_dependency() |
| 81 | + # We could just intersect 'extra == "pinned"' with the marker. |
| 82 | + # However, since this extra is not part of the marker, we can avoid |
| 83 | + # some work by building the MultiMarker manually. Besides, |
| 84 | + # we can ensure that the extra is the first part of the marker. |
| 85 | + extra_marker = parse_marker('extra == "pinned"') |
| 86 | + locked_marker = info.get_marker({MAIN_GROUP}) |
| 87 | + if locked_marker.is_any(): |
| 88 | + dependency.marker = extra_marker |
| 89 | + else: |
| 90 | + # We explicitly do not MultiMarker.of() here |
| 91 | + # because it is not necessary. |
| 92 | + dependency.marker = MultiMarker(extra_marker, locked_marker) |
| 93 | + self.poetry.package.add_dependency(dependency) |
| 94 | + for builder_class in builders: |
| 95 | + builder = builder_class(self.poetry, executable=executable) |
| 96 | + builder._meta.provides_extra.append("pinned") |
| 97 | + builder.build(target_dir) |
73 | 98 |
|
74 | 99 | def handle(self) -> int: |
75 | 100 | if not self.poetry.is_package_mode: |
|
0 commit comments