Skip to content
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

Fully idempotent install command -- install application as specified #1538

Open
manualdidact opened this issue Sep 6, 2024 · 0 comments
Open

Comments

@manualdidact
Copy link

I am considering using pipx as the primary tool for distributing and installing locally-developed applications on our workstations. As such, what I [think I] want is a way to invoke pipx from scripts to install applications, in a way that is idempotent and achieves the installation as specified, regardless of what software is already installed (or not) by pipx.

I'd like to be able to, for example:

sudo pipx install --global --python /usr/local/bin/python3.12 <pip-spec>

where <pip-spec> can be any specifier that can be supplied to pip (a local path, a Git URL, etc). In a script I won't have anything more than that to supply to the command, and so the rest must be derived from the given information. (Obviously no challenge for pipx, yet.)

The objective: From a command like the above I'd like to end up with the application installed at the latest version possible from the given specification, with the requested python interpreter, regardless of whether or not it was installed before or installed differently with pipx. I don't see any means to achieve this currently.

I initially thought about doing it by scripting around pipx to figure out whether to invoke it with install or upgrade or reinstall and so forth, using pipx list --short to inquire about already installed packages, and even finding and parsing the various pipx_metadata.json files to establish associations between installed distribution names and pip specifiers. But going the other way (from possibly-not-yet-installed pip specifiers to distribution names) appears to be a hard problem and I see pipx is already going to great lengths to do this (installing in a temporary venv and listing the installed package to get the name, wow), so it started to make more sense to think of this as a feature that could/should be added to pipx itself.

Some thoughts on the desired behavior:

  • If the application is not installed, install it.
  • If the application is installed with the requested Python interpreter, check the application version and if it matches what would be installed then no-op by default
    • If the installed version is lower, upgrade
    • If the installed version is higher for some reason, downgrade or reinstall
  • If the application is already installed but with a different Python interpreter, reinstall
    In all above cases, return a zero to the shell. Return nonzero only on an unresolvable operational error.

If this is something anyone else might want ... should it be implemented as an option to the install command, or a separate command, or an enhancement to the default functionality of install (rather than generating an error)? Would anyone be interested if I worked on a PR for a feature like this? Are there confounding or complicating use cases I'm not considering?

Or have I missed an existing feature that would already do what I'm looking for?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant