direnv

  • direnv install
    curl -sfL https://direnv.net/install.sh | bash
  • .envrc file tips
    # use expand_path
    export KUBECONFIG=$(expand_path ./provision/kubeconfig)
    
  • ~/.config/direnv/direnvrc populate local .env file
    # ~/.config/direnv/direnvrc
    realpath() {
        [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
    }
    
    update_dotenv() {
        echo 'Running update dotenv'
        DOTENVFILE=$(realpath ".env")
        while IFS='=' read -r name value ; do
            [ "$name" = "_" ] && continue
            [ "$name" = "BROWSER" ] && continue
            [ "$name" = "CDPATH" ] && continue
            [ "$name" = "GIT_ASKPASS" ] && continue
            [ "$name" = "HISTTIMEFORMAT" ] && continue
            [ "$name" = "INFOPATH" ] && continue
            [ "$name" = "MANPATH" ] && continue
            [ "$name" = "OLDPWD" ] && continue
            [ "$name" = "ORIGINAL_XDG_CURRENT_DESKTOP" ] && continue
            [ "$name" = "PATH" ] && continue
            [ "$name" = "SHELL" ] && continue
            [ "$name" = "SHLVL" ] && continue
            [ "$name" = "TF_PLUGIN_CACHE_DIR" ] && continue
            [ "$name" = "VIRTUAL_ENV" ] && continue
            [[ $name = __CF* ]] && continue
            [[ $name = ASDF_* ]] && continue
            [[ $name = BASH_* ]] && continue
            [[ $name = DIRENV_* ]] && continue
            [[ $name = HISTFILE* ]] && continue
            [[ $name = HOMEBREW* ]] && continue
            [[ $name = ITERM_* ]] && continue
            [[ $name = SSH_* ]] && continue
            [[ $name = TERM_* ]] && continue
            [[ $name = VSCODE_* ]] && continue
            [[ $name = XDG_* ]] && continue
            [[ $name = XPC_* ]] && continue
            [[ $name = *ZDOT* ]] && continue
            if [ -z "$value" ]; then
                echo "${name}="
                continue
            fi
            printf '%s="%s"\n' $name "$value"
        done < <(env|sort) > $DOTENVFILE
    
    }
    
  • .envrc to write out .env for use with docker
    # https://direnv.net/
    layout python
    dotenv_if_exists .build-vars
    dotenv_if_exists .env-local
    dotenv_if_exists ./overrides/env-local
    
    # Generate .env file for docker-compose, excluding system variables
    EXCLUDE_VARS=$(cat <<'EOF'
    __CF*
    BUNDLED_DEBUGPY_PATH
    COLORTERM
    COMMAND_MODE
    CURSOR_TRACE_ID
    DIRENV_*
    DNS_AWS_ACCESS_KEY_ID
    DNS_AWS_SECRET_ACCESS_KEY
    GIT_ASKPASS
    HOME
    LANG
    LC_*
    LOGNAME
    OLDPWD
    PAGER
    PATH
    PS?
    PWD
    SHELL
    SHLVL
    USER
    VSCODE_*
    ZDOTDIR
    EOF
    )
    EXCLUDE_PATTERN=$(echo "$EXCLUDE_VARS" | sed 's/\*/\.\*/g; s/?/./g' | sed 's/^/^/' | sed 's/$/=/' | tr '\n' '|' | sed 's/|$//')
    env | grep -vE "$EXCLUDE_PATTERN" | sort > .env