关于 direnv
direnv 根据当前工作目录自动管理环境变量,进入项目目录时加载设置,离开时卸载。通过 .envrc 文件配置,无需修改 shell 配置,适合隔离不同项目的环境。
主要功能
- 01进入目录时自动加载 .envrc 中定义的环境变量
- 02离开目录时自动卸载环境变量,保持 shell 清洁
- 03支持多种 shell 集成(bash、zsh、fish 等)
- 04通过 direnv allow 安全地授权执行脚本
适用场景
- 01为不同项目隔离环境变量,避免冲突
- 02管理项目特定的 API 密钥和配置
- 03自动切换不同版本的开发工具和依赖
安装
选择你的系统或包管理器,复制命令到终端运行。
安装完成后运行direnv --version确认安装成功。
命令示例
常用命令按使用顺序排列。
详细介绍
direnv——让你的 .profile 更简洁
direnv 是 shell 的扩展。它为现有 shell 增添了一项新功能,可根据当前目录加载和卸载环境变量。
使用场景
- 加载 12factor 应用的环境变量
- 为每个项目创建隔离的开发环境
- 加载用于部署的机密信息
工作原理
每次显示提示符之前,direnv 都会检查当前目录及其父目录中是否存在 .envrc 文件(以及可选的 .env 文件)。如果文件存在(且已获授权),direnv 会在 bash 子 shell 中加载该文件,然后捕获所有导出的变量,并使其可供当前 shell 使用。
它支持 bash、zsh、tcsh 和 fish 等常见 shell 的钩子。这让你可以为项目设置专用环境变量,而不必让 ~/.profile 变得杂乱。
由于 direnv 被编译为单个静态可执行文件,每次显示提示符时运行也足够快,几乎不会被察觉。它也与语言无关,可用于构建类似 rbenv、pyenv 和 phpenv 的解决方案。
入门
前置条件
- 类 Unix 操作系统(macOS、Linux 等)
- 受支持的 shell(bash、zsh、tcsh、fish、elvish、powershell、murex、nushell)
基本安装
- 大多数发行版都已打包 direnv。详情请参阅安装文档。
- 将 direnv 钩入你的 shell。
现在重启 shell。
快速演示
安装 direnv 后,可在 shell 中跟着操作。
# Create a new folder for demo purposes.
$ mkdir ~/my-project
$ cd ~/my-project
# Show that the FOO environment variable is not loaded.
$ echo ${FOO-nope}
nope
# Create a new .envrc. This file is bash code that is going to be loaded by
# direnv.
$ echo export FOO=foo > .envrc
.envrc is not allowed
# The security mechanism didn't allow to load the .envrc. Since we trust it,
# let's allow its execution.
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
# Show that the FOO environment variable is loaded.
$ echo ${FOO-nope}
foo
# Exit the project
$ cd ..
direnv: unloading
# And now FOO is unset again
$ echo ${FOO-nope}
nope
某些标准库函数会在 .direnv/ 中存储文件。请将 .direnv/ 添加到 .gitignore。对于不想提交的本地覆盖设置,请在 .envrc 中加入 source_env_if_exists .envrc.local,并将 .envrc.local 也加入忽略列表。
标准库
手动导出变量有些繁琐,因此 direnv 提供了一组实用函数,可在 .envrc 文件的上下文中使用。
例如,PATH_add 函数用于扩展路径,并将其添加到 $PATH 环境变量的开头。你可以用 PATH_add bin 代替 export PATH=$PWD/bin:$PATH。这样写更简洁,也能避免 $PATH=bin 这类常见错误。
如需查找所有可用函数的文档,请参阅 direnv-stdlib(1) man 手册。
你也可以通过在 ~/.config/direnv/direnvrc 或 ~/.config/direnv/lib/*.sh 中创建 bash 文件来编写自己的扩展。该文件会在 .envrc 之前加载,因此你可以据此为 direnv 添加自己的扩展。
请注意,.env 文件不支持此功能。如果需要同时使用两者,可以在 .envrc 中利用标准库,并在末尾添加 dotenv,以指示 direnv 接着读取 .env 文件。
文档
- 安装 direnv
- 钩入你的 shell
- 为 direnv 开发
- 使用 direnv 和 ruby-install 管理 Ruby
- 在 GitHub Actions 中使用 direnv
- 社区 Wiki
记得看看 Wiki!其中包含各种实用信息,例如常见用法示例、编辑器集成以及技巧。
手册页
常见问题
根据 GitHub issue 讨论,以下是用户最容易感到困惑的问题:
-
direnv 有一个标准库,其中包含一系列多年来我发现有用并积累下来的实用函数。你可以在这里找到它:https://github.com/direnv/direnv/blob/master/stdlib.sh
-
只需将一个 bash 文件添加到
~/.config/direnv/direnvrc,即可用自己的一组函数覆盖标准库。此文件会被加载,其内容可供任何.envrc文件使用。 -
direnv 不会将
.envrc加载到当前 shell 中。它会创建一个新的 bash 子进程来加载标准库、direnvrc 和.envrc,然后只将环境差异导出回原始 shell。这样 direnv 就能准确记录环境更改,并兼容各种 shell。这也意味着目前无法导出别名和函数。
翻译
direnv 文档也提供其他语言版本:
贡献
欢迎提交 Bug 报告、贡献代码和派生项目。所有 Bug 报告和其他形式的讨论都在 http://github.com/direnv/direnv/issues 上进行。
也可以到 Matrix 聊聊。如果你提出问题,请记得留意回复,因为并非所有人全天在线。
测试
要运行测试,请使用以下命令:(你可能需要安装 homebrew)
brew bundle
make test
互补项目
如果你在使用 direnv,下面列出了一些值得了解的项目。
相关项目
以下是一些设计理念相近的其他项目,欢迎提交新的项目。
- Environment Modules - 最早的环境加载系统之一(而且至今仍很出色)
- autoenv - 较早出现、广受欢迎且轻量。
- zsh-autoenv - 融合了 autoenv 和 smartcd 的功能丰富的工具:进入/离开事件、嵌套、暂存(仅限 Zsh)。
- asdf - 纯 bash 解决方案,带有插件系统。asdf-direnv 插件可让你在 direnv 中使用由 asdf 管理的工具。
- ondir - OnDir 是一个小型程序,可自动执行特定目录的任务
- shadowenv - 使用 s-expression 格式定义要执行的环境更改
- quickenv -
.envrc文件的替代加载器,不会挂接到 shell 中,并优先考虑速度而非便利性。 - mise - 将 direnv、make 和 asdf 集于一身的工具。
商业支持
需要帮助或定制服务?
联系 Numtide 获取报价。我们让公司能够轻松使用开源项目:https://numtide.com/contact