Direnv

From wikinotes
Revision as of 15:26, 11 February 2021 by Will (talk | contribs) (→‎Configuration)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

direnv lets you modify your environment as you change directories.

Documentation

github https://github.com/direnv/direnv
stdlib docs https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md
stdlib src (more complete) https://github.com/direnv/direnv/blob/master/stdlib.sh

Locations

(.|..)/.envrc instructions to load on cd
~/.config/direnv/lib/*.sh define your own functions for .envrc

Overview

When directory is changed, current dir, and all parent dirs are checked for a trusted .envrc file.
If present, it is loaded.

Integrate into your shell by adding eval "$(direnv hook zsh)" to your shell's rcfile.

After making changes to .envrc, run direnv trust to allow the code to execute.

Install

WARNING:

if installing direnv with the intention of using it alongside nix, use nix to install it

pacaur -S direnv   # archlinux
nix-env -i direnv  # nix/nixos

Configuration

For direnv to work, you need to add a hook to your shell.
I've encountered recursion issues with direnv+nix, so I omit the hook if I'm already in a direnv resolved environment

Here is my zshrc/bashrc config

# skip loading direnv if it is already loaded
if test -z $DIRENV_DIR; then
    if whereis direnv 2&>1 1> /dev/null ; then
        case "$(basename $SHELL)" in
            zsh)
                eval "$(direnv hook zsh)"
                ;;
            bash)
                eval "$(direnv hook bash)"
                ;;
            *)
                echo "skip" /dev/null
                ;;
        esac
    fi
fi

Syntax

direnv is just shellscript