-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Lock markers and groups #9427
base: main
Are you sure you want to change the base?
Lock markers and groups #9427
Conversation
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
ec11430
to
49f69c9
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
49f69c9
to
4d01327
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
4d01327
to
241ecfe
Compare
Deploy preview for website ready! ✅ Preview Built with commit 713e672. |
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
241ecfe
to
b56b49a
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
b56b49a
to
50e93f7
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
50e93f7
to
a65c879
Compare
a65c879
to
623602d
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
623602d
to
3e3c070
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
3e3c070
to
46a8221
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
46a8221
to
5db16dd
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
5db16dd
to
517080a
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
517080a
to
bdf5dfb
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
bdf5dfb
to
1e0300b
Compare
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
1e0300b
to
1244d21
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not my area of expertise, so not 100% sure, but looks pretty good to me, minor comments
src/poetry/installation/installer.py
Outdated
@@ -249,6 +258,13 @@ def _do_install(self) -> int: | |||
"pyproject.toml changed significantly since poetry.lock was last" | |||
" generated. Run `poetry lock [--no-update]` to fix the lock file." | |||
) | |||
if not reresolve and not self._locker.is_locked_groups_and_markers(): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if not reresolve and not self._locker.is_locked_groups_and_markers(): | |
if not (reresolve or self._locker.is_locked_groups_and_markers()): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
src/poetry/installation/installer.py
Outdated
@@ -236,10 +233,18 @@ def _do_install(self) -> int: | |||
with solver.provider.use_source_root( | |||
source_root=self._env.path.joinpath("src") | |||
): | |||
ops = solver.solve(use_latest=self._whitelist).calculate_operations() | |||
solution = solver.solve(use_latest=self._whitelist) | |||
solved_packages = solution.get_solved_packages() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any reason for making this into 2 variables? solution
doesn't seem to be used anywhere past this point.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One more variable but one less line. No strong opinion so I changed it.
…ting locked markers) (python-poetry#9427) - introduce "installer.re-resolve" config option (default: True) - if the config option is set to False and the lock file is at least version 2.1, the installer will not re-resolve but evaluate locked markers
1244d21
to
713e672
Compare
Pull Request Check List
Requires: #9345
Requires: python-poetry/poetry-core#733
First commit
Write information about the resulting groups that require a locked package and the resulting marker to the lock file. (Information is only written, not used yet.)
Second commit
Introduce a new config option
installer.re-resolve
(defaulttrue
); when set tofalse
the marker information from the lock file is used, there is no re-resolving anymore when installing from the lock file.Motivation
What triggered me was the discussion at https://discuss.python.org/t/lock-files-again-but-this-time-w-sdists and especially https://github.com/brettcannon/peps/blob/lock-file/peps/pep-9999.rst, which might become a draft for a general lock file. To support this lock file format, we have to lock the resulting markers for packages so that re-resolving is not required for installation.
Further
poetry-plugin-export
and get rid ofdependency walk failed
issues.make use of locked markers in lock file version 2.1 and thereby avoid
dependency walk failed
poetry-plugin-export#286PoC: automatically create a
pinned
extra with dependencies pinned from the lock file #9428Performance
We have to distinguish between locking and installing.
Locking
There is an additional step to calculate the resulting markers so this change can only make things slower. However, I could not measure a significant increase in time required for locking for several projects. I suppose that's because what we are doing in the additional step are mostly marker operations, which have probably been cached during dependency resolution before.
Installing
Evaluating markers instead of re-resolving could be faster or slower. However, I also could not measure a significant effect here. I suppose determining the exact packages to install is just not a bottleneck compared to the actual installation. Even when all packages were already installed (and installation is a noop), I could not measure a difference. However, there is a side effect:
Side effect on installation process
With re-resolving we are installing batches of packages in parallel. The batches are determined by the depth in the dependency graph (same depth -> same batch). Since we do not lock the depth, without re-resolving all packages are in the same batch.
On the one hand, this can have a positive effect on performance because we do not have to wait for the last package of a batch.
(I could observe the complete installation of the dependencies of a largish project with all packages in the cache going down from 70s to 60s.)
On the other hand, this could have a negative effect on robustness (due to race conditions). I suppose, creating batches of packages with the same depth results in only installing packages in parallel that are (more or less) independent of each other.
(If a package depends on another package, they will normally have a different depth.) Parallel installation might be an issue if two packages write to the same directory (name space packages) and try to create it at the same time.
Conclusion
Locking the resulting groups and markers opens up some new possibilities, especially for
poetry-plugin-export
. Installation without re-resolving is not a game changer on its own. Only the side effect will probably decrease the time for installation in some cases.For now, I decided to make installation without re-resolving opt-in. We can also make it opt-out if we think it is safe enough and want to get more feedback.