Open alex opened 1 week ago
👍 Can you walk me through how you'd use this? Like, if they were included in the requirements.txt, how would you "restore" / respect them in subsequent commands given build isolation?
(I want to support this.)
My immediate use case is to prepare constraints files that can be used with --build-constraints
Now that uv build
has --build-constraint
support, this would enable easily building those constraints files. Right now we do it by manually preparing a requirements.in
from the build-system.requires
, but that's obviously manual and error prone.
What if the build requirements conflict between different packages though?
Interesting question, I hadn't considered that. I'm not sure that would occur in our use case (taking specific local projects and getting their build dependencies), but clearly in the general case, it'd be a problem.
If I'm understanding this rightly, then this is also desirable for building wheels in a Docker container from source, in which situation you want to programmatically obtain the build requirements before doing a --no-build-isolation
run of pip download
. You may assume here they are compatible, and just need resolving (i.e. a uv pip compile
step), without this you just do this by hand by inspecting the build-system.requires
TOML section of each package's build dependencies).
In this case conflict would be fine to error out on, it'd just cue the user to split this download
process up per-requirement (or use separate lists?
I've ended up making distinct subpackages named (dependencyname_build
) with the build system requirements as dependencies in my current project to achieve this... (WIP)
Here's my 2 cents:
--all-build-deps
, uv pip compile should only have an option to output build dependencies only, this is because uv supports --build-constraints
where as pip-tools is bound by the fact pip can only pass build constraints via PIP_CONSTRAINT
, which also affects runtime dependencies--only-binary :all:
, for the build dependencies, when resolving build dependencies, as not to deal with recursive build dependenciesrequirement.in
-> requirements.txt
-> build-constraints.txt
, I think you would need to consider carefully if all existing CLI options apply to runtime requirements or build dependencies or bothBuild dependencies are complicated enough that you will not be able to capture all use cases in a requirements file, but this approach should be "good enough" for a lot of users I think. Most users will probably find they are pinned to some versions of setuptools and some version of hatch, and maybe one or two more build backends, and that's it.
However, for true locking you would need to be able to capture the potential recursive nature of build dependencies in a lock file format. Unfortunately when I asked some questions about PEP 751 build dependencies the response was to drop build dependencies from the spec.
Finally these would be "nice to have" features if this uv pip compile "build-dependencies" options existed:
--only-binary
and --no-binary
options (although again, this is complex on what the CLI options are being applied to)P.S. I'm sure there's stuff I'm not thinking of, e.g. maybe it makes more sense for uv that the build constraints are outputed into a seperate output file instead of only outputing the build constraints for various technical or workflow reasons.
Doing build deps only would be fine for me
On Tue, Sep 17, 2024, 12:34 PM Damian Shaw @.***> wrote:
Here's my 2 cents:
- Unlike pip-compile which includes build dependencies in it's regular output https://github.com/jazzband/pip-tools?tab=readme-ov-file#maximizing-reproducibility with --all-build-deps, uv pip compile should only have an option to output build dependencies only, this is because uv supports --build-constraints where as pip-tools is bound by the fact pip can only pass build constraints via PIP_CONSTRAINT
- It should be recommended / defaulted / forced to use --only-binary :all: when resolving build dependencies, as not to deal with recursive build requirements
- It should be documented that if the user wants maximum reproducibility they must create the build requirements of each runtime requirement source distribution, and build each one with it's own build constraints
- If there is a conflict in build requirements point them to some version of 3, that they must build the packages independently
Build dependencies are complicated enough that you will not be able to capture all use cases in a requirements file, but this approach should be "good enough" for a lot of users I think. Most users will probably find they are pinned to some versions of setuptools and some version of hatch, and maybe one or two more build backends, and that's it.
However, for true locking you would need to be able to capture the potential recursive nature of build requirements in a lock file format. Unfortunately when I asked some questions anout PEP 751 the response was to drop build requirements https://discuss.python.org/t/pep-751-lock-files-again/59173/222 from the spec.
Finally these would be "nice to have" features if this uv pip compile "build-requirements" options existed:
- Generate build requirements for all the packages in a requirement file and it only generate the requirements for those packages that are "allowed" to be sdists, taking into account --only-binary and --no-binary options.
- The hash output not include sdist hashes
— Reply to this email directly, view it on GitHub https://github.com/astral-sh/uv/issues/7052#issuecomment-2356406708, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAAGBDPNF3AMPKAKWE7W73ZXBK25AVCNFSM6AAAAABNVFZFTGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGNJWGQYDMNZQHA . You are receiving this because you authored the thread.Message ID: @.***>
Yeah the thing I don't know how to solve is (4) -- that every dependency defines its own build requirements, and they're welcome to conflict.
Yeah the thing I don't know how to solve is (4) -- that every dependency defines its own build requirements, and they're welcome to conflict.
For producing a constraints file (and not a structured lock file) I don't think it's possible.
The user would be responsible for handling this situation themselves, they would need to build each package separately with their own file, e.g by making a script that loops over their requirements and running like this overly simplified pseudo code:
for requirement in sdist-requirements.txt:
echo {requirement} | uv pip compile {build dependency options} - > build-constraints-{requirement}.txt
uv build {requirement} --build-constraints build-constraints-{requirement}.txt
{move wheel to index / file location}
uv pip install {install options that include newly built wheel}
However, I suspect this would affect a very small number of users.
I guess my answer would be: within the limits of the requirements.txt format, you probably can't solve it fully.
But then what Damian says comes in: it effects probably a small number of users, and just unifying all of them likely works well enough, and doesn't precludes a better format later.
On Tue, Sep 17, 2024, 1:56 PM Charlie Marsh @.***> wrote:
Yeah the thing I don't know how to solve is (4) -- that every dependency defines its own build requirements, and they're welcome to conflict.
— Reply to this email directly, view it on GitHub https://github.com/astral-sh/uv/issues/7052#issuecomment-2356564030, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAAGBGUEM6RINC5YRBHS2TZXBULXAVCNFSM6AAAAABNVFZFTGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGNJWGU3DIMBTGA . You are receiving this because you authored the thread.Message ID: @.***>
Right now
uv pip compile
does not include build dependencies in its output. It would be incredibly helpful if there was a way to include them.