Skip to content

fix(pypi): pull fewer wheels with experimental_index_url - #3058

Merged
aignas merged 3 commits into
bazel-contrib:mainfrom
aignas:exp/pypi-simplify
Aug 17, 2025
Merged

fix(pypi): pull fewer wheels with experimental_index_url#3058
aignas merged 3 commits into
bazel-contrib:mainfrom
aignas:exp/pypi-simplify

Conversation

@aignas

@aignasaignas commented Jul 5, 2025

Copy link
Copy Markdown
Collaborator

Before this we would pull all of the wheels that the user target configuration
would be compatible with and that meant that it was not customizable. This also
meant that there were a lot of footguns in the configuration where the select
statements were not really foolproof.

With this PR we select only those sources that need to be for the declared
configurations.

Freethreaded support should be done by defining extra freethreaded platforms
using the new builder API. It is done as a followup in #3063.

This is also changing the default platforms to be only the fully supported
platforms. This makes the testing easier and avoids us running into
compatibility issues during the rollout.

Work towards #2747
Fixes#2759
Fixes#2849

@aignas
aignasforce-pushed the exp/pypi-simplify branch from 1d55c50 to c95dce6CompareJuly 5, 2025 03:21
@aignas

aignas commented Jul 5, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Created this as WIP to signal that I am working on this and to invite feedback. The CI should be mostly happy but there are a few TODOs before we can fully merge and I want to test it a little bit more.

  • Freethreaded platform definition should be possible.
  • Probably something else that I need to think of more carefully.

TODO cleanup after this PR is proven to not break things:

@aignasaignas changed the title next: pypi stabilization of experimental_index_urlfix(pypi): pull fewer wheels with experimental_index_urlJul 5, 2025
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
TODO:
- [ ] Fix the remaining expectations in the unit tests. Maybe make the
tests less brittle and define platforms for unit testing.
@aignas

Copy link
Copy Markdown
CollaboratorAuthor

The CI failure is a flake.

@aignas
aignasforce-pushed the exp/pypi-simplify branch 2 times, most recently from dc50a12 to 855a673CompareJuly 6, 2025 13:42
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
TODO:
- [ ] Fix the remaining expectations in the unit tests. Maybe make the
tests less brittle and define platforms for unit testing.
@aignas

Copy link
Copy Markdown
CollaboratorAuthor

This would be ready to be reviewed, but because it is stacked on two PRs, let's get those out of the way first.

aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
TODO:
- [ ] Fix the remaining expectations in the unit tests. Maybe make the
tests less brittle and define platforms for unit testing.
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
TODO:
- [ ] Fix the remaining expectations in the unit tests. Maybe make the
tests less brittle and define platforms for unit testing.
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
TODO:
- [ ] Fix the remaining expectations in the unit tests. Maybe make the
tests less brittle and define platforms for unit testing.
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
TODO:
- [ ] Fix the remaining expectations in the unit tests. Maybe make the
tests less brittle and define platforms for unit testing.
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
Since the parent PR is simplifying the code a great deal, we can remove
the unused code and its tests. Hopefully this makes the whole codebase
easier to contribute to. There is probably more cleanup that can be
done, but since the CI is now green, it's a good start.
aignas added a commit to aignas/rules_python that referenced this pull request Jul 6, 2025
Stacked on bazel-contrib#3058
Since the parent PR is simplifying the code a great deal, we can remove
the unused code and its tests. Hopefully this makes the whole codebase
easier to contribute to. There is probably more cleanup that can be
done, but since the CI is now green, it's a good start.
Comment threadMODULE.bazel
Comment threadexamples/bzlmod/MODULE.bazel Outdated
Comment threadpython/private/pypi/extension.bzl Outdated
Comment threadpython/private/pypi/extension.bzl Outdated
Comment threadpython/private/pypi/extension.bzl
Comment threadpython/private/pypi/extension.bzl Outdated
Comment threadpython/private/pypi/select_whl.bzl
@keith

keith commented Jul 7, 2025

Copy link
Copy Markdown
Member

I hit this problem with this change (I don't support windows and use requirements_by_platform to exclude it too):

% bazel query 'deps(...)'
INFO: Repository rules_python++python+python_3_13_aarch64-pc-windows-msvc instantiated at:
<builtin>: in <toplevel>
Repository rule python_repository defined at:
/home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python+/python/private/python_repository.bzl:271:36: in <toplevel>
ERROR: /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python+/python/private/python_repository.bzl:76:34: An error occurred during the fetch of repository 'rules_python++python+python_3_13_aarch64-pc-windows-msvc':
Traceback (most recent call last):
File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python+/python/private/python_repository.bzl", line 76, column 34, in _python_repository_impl
rctx.download_and_extract(
Error in download_and_extract: java.io.IOException: Error extracting /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862/cpython-3.13.5+20250702-aarch64-pc-windows-msvc-install_only.tar.gz to /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862: Prefix "python/install" was given, but not found in the archive. Here are possible prefixes for this archive: "python".
ERROR: Evaluation of query "deps(...)" failed: preloading transitive closure failed: no such package '@@rules_python++python+python_3_13_aarch64-pc-windows-msvc//': java.io.IOException: Error extracting /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862/cpython-3.13.5+20250702-aarch64-pc-windows-msvc-install_only.tar.gz to /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862: Prefix "python/install" was given, but not found in the archive. Here are possible prefixes for this archive: "python".
Loading: 2635 packages loaded

@aignas

aignas commented Jul 7, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Thank you, I'll take a look later.

Marking this as a draft for now.

@aignas
aignas marked this pull request as draft July 7, 2025 23:50
@aignas
aignas marked this pull request as ready for review July 8, 2025 04:09
@aignas

Copy link
Copy Markdown
CollaboratorAuthor

I hit this problem with this change (I don't support windows and use requirements_by_platform to exclude it too):

% bazel query 'deps(...)'
INFO: Repository rules_python++python+python_3_13_aarch64-pc-windows-msvc instantiated at:
<builtin>: in <toplevel>
Repository rule python_repository defined at:
/home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python+/python/private/python_repository.bzl:271:36: in <toplevel>
ERROR: /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python+/python/private/python_repository.bzl:76:34: An error occurred during the fetch of repository 'rules_python++python+python_3_13_aarch64-pc-windows-msvc':
Traceback (most recent call last):
File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python+/python/private/python_repository.bzl", line 76, column 34, in _python_repository_impl
rctx.download_and_extract(
Error in download_and_extract: java.io.IOException: Error extracting /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862/cpython-3.13.5+20250702-aarch64-pc-windows-msvc-install_only.tar.gz to /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862: Prefix "python/install" was given, but not found in the archive. Here are possible prefixes for this archive: "python".
ERROR: Evaluation of query "deps(...)" failed: preloading transitive closure failed: no such package '@@rules_python++python+python_3_13_aarch64-pc-windows-msvc//': java.io.IOException: Error extracting /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862/cpython-3.13.5+20250702-aarch64-pc-windows-msvc-install_only.tar.gz to /home/ubuntu/.cache/bazel/_bazel_ubuntu/480ee760ab026be301955dc1adc19e40/external/rules_python++python+python_3_13_aarch64-pc-windows-msvc/temp6334258738180209862: Prefix "python/install" was given, but not found in the archive. Here are possible prefixes for this archive: "python".
Loading: 2635 packages loaded

@keith, #3070 should fix your issue, I think. The toolchain pulling in query seems to be unrelated to pip integration, so if it works after #3070 and #3058 is merged, I think it is safe to say that the issue is resolved.

Comment threadpython/private/pypi/select_whl.bzl Outdated
@aignas
aignas requested a review from hartikainenJuly 12, 2025 14:19
aignas added a commit to aignas/rules_python that referenced this pull request Aug 3, 2025
DO NOT MERGE: stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
hartikainen pushed a commit to hartikainen/rules_python that referenced this pull request Aug 3, 2025
DO NOT MERGE: stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in bazel-contrib#3058 will be easier to
override.
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
Before this PR we would be constructing slightly different environments
when the `env_marker_setting` is doing it in the analysis phase and when
we are doing it in the repo phase due to how the defaults are handled.
In this change we simply reuse the same select statements and add an extra
helper that is allowing us to process that.
Work towards bazel-contrib#2949
Prep for bazel-contrib#3058
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
This will be needed when we start selecting wheels entirely in the
bzlmod extension evaluation phase (bazel-contrib#3058).
This adds a few unit tests to just ensure that we conform to the spec
even though the code is very simple.
Work towards bazel-contrib#2747
Work towards bazel-contrib#2759
Work towards bazel-contrib#2849
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in bazel-contrib#3058 will be easier to
override.
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
DO NOT MERGE: stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
@aignas
aignas marked this pull request as draft August 9, 2025 13:45
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
DO NOT MERGE: stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in bazel-contrib#3058 will be easier to
override.
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 9, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in bazel-contrib#3058 will be easier to
override.
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 10, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in bazel-contrib#3058 will be easier to
override.
Work towards bazel-contrib#2747
aignas added a commit to aignas/rules_python that referenced this pull request Aug 10, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in bazel-contrib#3058 will be easier to
override.
Work towards bazel-contrib#2747
@aignas
aignasforce-pushed the exp/pypi-simplify branch 2 times, most recently from c757256 to e2d2dd0CompareAugust 10, 2025 15:11
aignas added a commit to aignas/rules_python that referenced this pull request Aug 10, 2025
DO NOT MERGE: stacked on bazel-contrib#3058
This is a continuation of bazel-contrib#3058 where we define freethreaded
platforms. They need to be used only for particular python versions
so I included an extra marker configuration attribute where we
are using pipstar marker evaluation before using the platform.
I think this in general will be a useful tool to configure only
particular platforms for particular python versions
Work towards bazel-contrib#2548, since this shows how we can define custom platforms
Work towards bazel-contrib#2747
github-merge-queueBot pushed a commit that referenced this pull request Aug 11, 2025
Before this PR we would be constructing slightly different environments
when the `env_marker_setting` is doing it in the analysis phase and when
we are doing it in the repo phase due to how the defaults are handled.
In this change we simply reuse the same select statements and add an
extra
helper that is allowing us to process that.
Work towards #2949
Prep for #3058
Co-authored-by: Richard Levasseur <richardlev@gmail.com>
aignas added a commit to aignas/rules_python that referenced this pull request Aug 11, 2025
This will be needed when we start selecting wheels entirely in the
bzlmod extension evaluation phase (bazel-contrib#3058).
This adds a few unit tests to just ensure that we conform to the spec
even though the code is very simple.
Work towards bazel-contrib#2747
Work towards bazel-contrib#2759
Work towards bazel-contrib#2849
github-merge-queueBot pushed a commit that referenced this pull request Aug 11, 2025
This will be needed when we start selecting wheels entirely in the
bzlmod extension evaluation phase (#3058).
This adds a few unit tests to just ensure that we conform to the spec
even though the code is very simple.
Work towards #2747
Work towards #2759
Work towards #2849
github-merge-queueBot pushed a commit that referenced this pull request Aug 11, 2025
This will be needed when we start selecting wheels entirely in the
bzlmod extension evaluation phase (#3058).
This adds a few unit tests to just ensure that we conform to the spec
even though the code is very simple.
Work towards #2747
Work towards #2759
Work towards #2849
github-merge-queueBot pushed a commit that referenced this pull request Aug 16, 2025
Before this PR the configuration for platforms would be built
non-incrementally, making it harder for users to override particular
attributes of the already configured ones.
With this PR the new features introduced in #3058 will be easier to
override.
Work towards #2747
Before this we would pull all of the wheels that the user target
configuration would be compatible with and that meant that it was not
customizable. This also meant that there were a lot of footguns in the
configuration where the select statements were not really foolproof.
With this PR we select only those sources that need to be for the
declared configurations.
Freethreaded support is done by defining extra freethreaded platforms
using the new builder API (bazel-contrib#3063).
This is also changing the default platforms to be only the fully supported
platforms. This makes the testing easier and avoids us running into
compatibility issues during the roll out.
Work towards bazel-contrib#2747Fixesbazel-contrib#2759Fixesbazel-contrib#2849
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: pippip/pypi integration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

experimental_index_url slows down downloads by 25-50% "Illegal ambiguous match" error with experimental_index_url

4 participants

@aignas@keith@hartikainen@rickeylev