前言

direnv 通过 hook 当前的 shell 来根据当前目录加载或卸载环境变量。

当进入项目对应目录之后,direnv 会检查当前和父目录中是否存在 .envrc 或 .env 的文件。如果文件存在并且有权限访问的话,则会将其加载到 BASH 的 shell 中,然后通过 direnv 捕获所有导出的变量,提供给当前 shell 使用。如果 .envrc 和 .env 文件同时存在的话,则将优先选择 .envrc 文件。

它支持像 Bash、ZSH、TCSH 和 FISH 这样的所有常见的 Shell 工具,允许项目特定的环境变量而不会对 ~/.profile 文件进行混乱。direnv 是 Go 语言编写的, 被编译成一个静态可执行文件,所以速度足够快。它也是语言无关的,可以用来构建类似于 rbenv、pyenv 和 phpenv 的解决方案

安装

直接安装

1
2
sudo apt update
sudo apt install direnv -y

使用官方脚本

1
curl -sfL https://direnv.net/install.sh | bash

Hook shell

  • For Bash
1
echo -e 'eval "\$(direnv hook bash)"' >> ~/.bashrc
  • For Zsh
1
echo -e 'eval "$(direnv hook zsh)"' >> ~/.zshrc

使用

在当前目录创建一个 .envrc 的文件, 写好你要添加的环境变量或者要 source 的命令

运行direnv allow 生效. 如果想要临时不生效, 可以运行direnv deny .

python 项目

1
2
3
# .envrc
source .env/bin/activate
unset PS1

docker-compose 传参

1
2
3
4
5
6
7
8
version: "3"
services:
web:
image: nginx
environment:
- "type=${USERTYPE}"
ports:
- "8080:80"