-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Description
#11440 (comment) is the currently agreed upon user-facing design for this feature.
What's the problem this feature will solve?
In #8049, we identified an use case for installing just the dependencies from pyproject.toml
.
As described in the solution section below --only-deps=<spec>
would determine all dependencies of <spec>
excluding that package itself and install those without installing the package. It could be used to
- allow specifying environment variables that are active only while building a package of interest (without having it be active while potentially building its dependencies).
- separate dependency installation from building and installing a package, allowing to rebuild a package in a docker build while the dependency installation step is loaded from cache.
This example shows both use cases:
# copy project metadata and install (only) dependencies
COPY pyproject.toml /myproj/
WORKDIR /myproj/
RUN pip install --extra-index-url="$PIP_INDEX" --only-deps=.[floob]
# copy project source files, build in a controlled environment and install our package
COPY src/mypkg/ /myproj/src/mypkg/
RUN env SETUPTOOLS_SCM_PRETEND_VERSION=2.0.2 python3 -m build --no-isolation --wheel
RUN pip install --no-cache-dir --no-dependencies dist/*.whl
Instead of the solution from #8049, @pradyunsg prefers a solution similar to the one below: #8049 (comment)
Describe the solution you'd like
One of those two, or similar:
-
(used in the example above)
--only-deps
would work like-r
in that it’s not a flag globally modifying pip’s behavior but a CLI option with one argument that can be specified multiple times. Unlike-r
it accepts a dependency spec and not a path to a file containing dependency specs.Where
pip install <spec>
first installs all dependencies and then (build and) install the package referred to by the spec itself,pip install --only-deps=<spec>
would only install the dependencies. -
--only-deps
would work like--[no|only]-binary
, in that it requires an argument specifying what package not to install. A placeholder like:requested:
could be used, e.g.:pip install --only-deps=:requested: .[floob]
Alternative Solutions
-
Re-using
-r
instead of adding--only-deps
.I don’t think this is a good idea, since people would be tempted to do
-r pyproject.toml
which would be wrong (Dependency specs including file paths look like like./path/to/pkg[extra1,extra2]
) -
Making
--only-deps
a global switch modifying pip’s behavior like e.g.--pre
.I have found that global switches like that are dangerous and not very intuitive. To install a dev version of your package, doing
pip install --pre mypkg
seems innocuous but will actually install dev versions ofmypkg
and all its dependencies that have any dev versions. It’s safer to do something likepip install mypkg>=0.1.post0.dev0
to limit dev version installations to one package. Similarly it’s unclear what a--only-deps
switch would apply to. Wouldpip install -r reqs.txt --only-deps
install the dependencies of every package specified in the file but none of those packages? -
Using e.g. beni to convert PEP 621 dependencies to a requirements.txt.
This works even today but feels like is shouldn’t be necessary as it involves quite a few steps, including writing a file to disk.
Additional context
NA
Code of Conduct
- I agree to follow the PSF Code of Conduct.