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.
quickenvdoes not hook into your shell. It only requires an addition to yourPATH.quickenvdoes not load.envrcwhen changing directories. Instead you need to initializequickenvper-project usingquickenv reload, and rerun that command everytime the.envrcchanges.quickenvdoes not even load environment variables into your shell. Instead you tellquickenvwhich binaries should run with those environment variables present (for examplequickenv shim python pytest poetry), and quickenv will wrap those commands in a custom binary, and put that "shim" on yourPATH.
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
-
quickenvcurrently assumesdirenvis in your path, in order to load its "standard library". -
quickenvalso currently does not have pre-built binaries. You need to install Rust, check out this repository, and install it yourself. -
quickenvassumes a POSIX environment.
# Install quickenv. Quickenv assumes itself to be installed in
# '~/.quickenv/bin/'. You can change that using QUICKENV_HOME.
# Into your bashrc/zshrc. This should be at the front of your PATH, such that
# quickenv can shim/shadow binaries effectively.
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.
# 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.
# Tell quickenv to place "shim" binaries for those commands in ~/.quickenv/bin/
# These commands will now run with the virtualenv enabled
# Other commands not explicitly shimmed will end up not running in the
# virtualenv at all. Whoops!
# Better shim them!
Advanced usage
# Your git hooks don't execute in the virtualenv for some reason? Just replace/shadow
# git with a binary that itself loads the virtualenv.
# Actually activate the virtualenv in your current shell. `quickenv vars`
# prints all the extra environment variables with which each shimmed binary runs.
# Or shim 'bash', so that when you open a subshell, the virtualenv is activated.
# Or shim 'make', so your Makefile runs in the virtualenv. This can save you from
# explicitly enumerating a bunch of commands, if you only ever run them via 'make'.
License
Licensed under MIT, see LICENSE.