pickley allows to install and keep up-to-date standalone pip-installable python CLIs such as tox, twine, etc. A bit like brew or apt, but based solely on pypi
It can work out of the box, without any configuration:
- pickley will install in the same folder it's running from (drop it in
/usr/local/bin
or~/.local/bin
for example) - All pypi packages with
console_scripts
entry point(s) can be immediately installed - Latest non-prerelease pypi version will be used, no automatic updates (you can run
pickley install ...
any time to upgrade)
With some configuration, the following becomes possible:
- You can create "channels" such as "stable" and choose which version you want installed
- You can use the wrap delivery method, which will make all your installed CLIs auto-upgrade themselves
- You can have the installed packages produced as pex or venv
Once you have pickley, you can get other python CLIs and use them as standalone programs, for example:
# One-liner to grab pickley, and drop it in /usr/local/bin $ curl -sLo /usr/local/bin/pickley `curl -s https://pypi.org/pypi/pickley/json | grep -Eo '"download_url":"([^"]+)"' | cut -d'"' -f4` $ which pickley /usr/local/bin/pickley $ pickley install tox twine Installed tox 3.2.1 Installed twine 1.11 $ which tox /usr/local/bin/tox $ tox --version tox version 3.2.1 $ pickley list base: /usr/local/bin tox 3.2.1 twine 1.11
See config
pickley can also be used to easily package your CLI project for delivery, example tox section for a project called foo
:
# Package ourselves up, this will produce a .tox/package/dist/foo executable ready to go [testenv:package] basepython = python changedir = {envdir} skip_install = True deps = pickley commands = pickley -ppex package {toxinidir} python ./dist/foo --version
pickley packages itself like this for example.
See pickley package --help
for options, by default:
- Produced package(s) (one per entry point) are dropped by default in
./dist
(configurable via--dist
or-d
) - Used wheels are dropped in
./build
(configurable via--build
or-b
) - We run
./dist/foo --version
here as a sanity check against our freshly produced package - Using tox's
changedir = {envdir}
allows to simplify invocations (relative paths are relative to{envdir}
, which is.tox/package
in this case) - Using
skip_install = True
just for speedup (the project itself is not needed withing the 'pacakage' tox env)
You can run the package
command from anywhere, for example this will drop a pex package in ./root/apps/myproject
:
pickley -ppex package path/to/myproject -droot/apps/myproject
Any pypi package that has
console_scripts
entry point can be installed and kept up-to-dateAims to work with zero configuration (but configuration is possible):
- entirely portable, installations are performed in the same folder where pickley resides,
drop it in
/usr/local/bin
and all the stuff you install with it will also be there - latest non pre-release version from pypi is used
- entirely portable, installations are performed in the same folder where pickley resides,
drop it in
Packaging is done via pex by default, but virtualenv or shiv can be used to (more possible in the future)
Commands:
- Go to https://github.com/zsimic/pickley/releases/latest
- Download pickley from there (1st link), and drop it in
~/.local/bin
for example (or any folder in your PATH)
Run:
curl -sLo ~/.local/bin/pickley `curl -s https://pypi.org/pypi/pickley/json | grep -Eo '"download_url":"([^"]+)"' | cut -d'"' -f4`
Run (you will need tox):
git clone https://github.com/zsimic/pickley.git cd pickley tox -e package cp .tox/package/pickley ~/.local/bin/