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-date Aims 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/