使用 direnv 在切换目录时添加 hook


前言

direnv – unclutter your .profile | direnv

是一个可以在切换目录时,自动执行 hook 的工具,可以用来自动加载环境变量,或者执行一些命令。

安装方式

Installation | direnv

brew install direnv

配置 shell

Setup | direnv

eval "$(direnv hook bash)"

配置文件

DIRENV.TOML 1 “2019” direnv “User Manuals” | direnv

~/.config/direnv/direnv.toml

使用示例

切换目录,会加载当前目录下的 .envrc 文件, 同时也会加载 ~/.config/direnv/direnvrc 文件

Home · direnv/direnv Wiki

比如我们有个 repo, 希望进入的时候,加载 .env, 并且切换 node 版本, 可以这样配置 .envrc:

set -e
use node

内置的指令

DIRENV-STDLIB 1 “2019” direnv “User Manuals” | direnv

.nvmrc 中,可以太慢内置指令,直接触发一些加载:

  • dotenv_if_exists: 加载 .env 文件
  • direnv status: 查看当前环境相关信息

结合 poetry

Python · direnv/direnv Wiki

在全局配置文件中,定义自定义的 layout_poetry, 然后项目 .nvmrc 中使用 layout poetry 即可。

layout_poetry() {
    PYPROJECT_TOML="${PYPROJECT_TOML:-pyproject.toml}"
    if [[ ! -f "$PYPROJECT_TOML" ]]; then
        log_status "No pyproject.toml found. Executing \`poetry init\` to create a \`$PYPROJECT_TOML\` first."
        poetry init
    fi

    if [[ -d ".venv" ]]; then
        VIRTUAL_ENV="$(pwd)/.venv"
    else
        VIRTUAL_ENV=$(poetry env info --path 2>/dev/null ; true)
    fi

    if [[ -z $VIRTUAL_ENV || ! -d $VIRTUAL_ENV ]]; then
        log_status "No virtual environment exists. Executing \`poetry install\` to create one."
        poetry install
        VIRTUAL_ENV=$(poetry env info --path)
    fi

    PATH_add "$VIRTUAL_ENV/bin"
    export POETRY_ACTIVE=1
    export VIRTUAL_ENV
}

没有提供 exit 目录的 hook

没找对这种方案。网上大多都是添加 zsh-hook: