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 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

```bash 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.

```bash 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

As part of executing the .envrc, a virtualenv has been created at './.venv/'.

There are multiple commands available in '.venv/bin/', such as 'pytest' (a test

runner), or 'sentry' (the main application).

'quickenv shim' makes those commands available in your shell.

quickenv shim

These commands will now run with the virtualenv enabled.

sentry devserver --workers pytest tests/sentry/ ```

Advanced usage

```bash

Alternatively you can shim commands explicitly. Be careful: Any command you

missed (such as 'python' or 'pip') would run outside of the virtualenv!

quickenv shim sentry pytest

You can also run commands within the current .envrc without shimming them.

quickenv exec -- pytest

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 alternatively, substitute your shell with one where quickenv is loaded

exec quickenv exec $SHELL

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

Curious which binary is actually being executed?

QUICKENV_LOG=debug make

[DEBUG quickenv] argv[0] is "make"

[DEBUG quickenv] attempting to launch shim

[DEBUG quickenv] abspath of self is /home/user/.quickenv/bin/make

[DEBUG quickenv] removing own entry from PATH: /home/user/.quickenv/bin

[DEBUG quickenv] execvp /usr/bin/make

...

```

License

Licensed under MIT, see LICENSE.