quickenv 0.3.0

An unintrusive environment manager
quickenv-0.3.0 is not a library.

quickenv: An unintrusive environment manager

direnv is a manager for loading/unloading environment variables per-project. It achieves this by hooking into your shell and executing a shellscript called .envrc upon cd, loading environment variables generated by that shellscript into your current shell. It is useful for automatically activating virtualenvs, for example.

Unfortunately direnv can be a little bit "intrusive" to use. For a start, it runs its own code in your shell. This alone is not noticeable in terms of terminal responsiveness, but the various .envrcs that people end up writing sometimes are. direnv does not have a reliable, out-of-the-box way to cache the execution of .envrcs, as it is arbitrary code, and so it runs everytime you cd in and out of a project.

quickenv is a replacement for direnv. It works with existing .envrcs, and as such is a drop-in replacement, but how you interact with quickenv and how it loads environment variables is fundamentally different.

  • quickenv does not hook into your shell. It only requires an addition to your PATH.
  • quickenv does not load .envrc when changing directories. Instead you need to initialize quickenv per-project using quickenv reload, and rerun that command everytime the .envrc changes.
  • quickenv does not even load environment variables into your shell. Instead you tell quickenv which binaries should run with those environment variables present (for example quickenv shim python pytest poetry), and quickenv will wrap those commands in a custom binary, and put that "shim" on your PATH.

quickenv is heavily inspired by volta which achieves version management for nodejs by also providing "shim" binaries for the most common commands (yarn, npm, node).

Installation

quickenv is work in progress and most likely contains bugs. that said, I use it daily at work

  • quickenv currently assumes direnv is in your path, in order to load its "standard library".

  • quickenv also currently does not have pre-built binaries. You need to install Rust and install it using Rust's package manager, Cargo.

  • quickenv assumes a POSIX environment.

cargo install quickenv

# Into your bashrc/zshrc. This should be at the front of your PATH, such that
# quickenv can shim/shadow binaries effectively.
export PATH=$HOME/.quickenv/bin/:$PATH

Usage

We're going to check out sentry, because that's one of the .envrcs I use. Note that Sentry's .envrc only works on MacOS.

git clone https://github.com/getsentry/sentry
cd sentry

# Execute the .envrc and cache the resulting environment variables in ~/.quickenv/envs/.
# Sentry will prompt you to create a virtualenv, install dependencies via homebrew, etc.
# Re-run this command manually everytime the .envrc changes.
quickenv reload

# Ensure all commands from the virtualenv are present outside of it. This will
# create executables in '~/.quickenv/bin/' that dispatch to the right binary.
quickenv shim

# Alternatively you can shim commands explicitly. Be careful: In this case, the
# command 'python' or 'pip' would run outside of the virtualenv!
quickenv shim sentry pytest

# Either way, these commands will now run with the virtualenv enabled
sentry devserver --workers
pytest tests/sentry/

Advanced usage

# Your git hooks don't execute in the virtualenv for some reason? Just replace
# git with a binary that itself loads the virtualenv.
quickenv shim git

# Actually activate the virtualenv in your current shell. `quickenv vars`
# prints all the extra environment variables with which each shimmed binary runs.
set -o allexport
eval "$(quickenv vars)"
set +o allexport

# Or shim 'bash', so that when you open a subshell, the virtualenv is activated.
quickenv shim bash

# Or shim 'make', so your Makefile runs in the virtualenv.
quickenv shim make

License

Licensed under MIT, see LICENSE.