direnv/direnv
GitHub: direnv/direnv
基于目录自动加载和卸载环境变量的 shell 扩展工具,让开发环境配置实现项目级隔离。
Stars: 14816 | Forks: 764
# direnv -- 让你的 .profile 不再杂乱
[](https://builtwithnix.org)
[](https://repology.org/project/direnv/versions)
[](https://repology.org/project/direnv/versions)
[](https://matrix.to/#/#direnv:numtide.com)
`direnv` 是一个 shell 扩展。它为现有的 shell 增加了一个新功能,可以根据当前目录加载和卸载环境变量。
## 使用场景
* 加载 [12factor apps](https://12factor.net/) 环境变量
* 创建每项目隔离的开发环境
* 加载用于部署的机密信息
## 工作原理
在每次提示之前,direnv 会检查当前目录和父目录中是否存在 `.envrc` 文件(以及[可选的](man/direnv.toml.1.md#codeloaddotenvcode) `.env` 文件)。如果文件存在(且已授权),它会被加载到一个 **bash** 子 shell 中,然后所有导出的变量会被 direnv 捕获,并提供给当前的 shell 使用。
它支持所有常见 shell 的 hook,如 bash、zsh、tcsh 和 fish。
这允许使用项目特定的环境变量,而不会弄乱 `~/.profile` 文件。
因为 direnv 被编译成单个静态可执行文件,它的速度非常快,在每次提示时几乎察觉不到。它也是语言无关的,可用于构建类似于 rbenv、pyenv 和 phpenv 的解决方案。
## 入门指南
### 前置条件
* 类 Unix 操作系统 (macOS, Linux, ...)
* 受支持的 shell (bash, zsh, tcsh, fish, elvish, powershell, murex, nushell)
### 基本安装
1. direnv 已经包含在大多数发行版中。详情请参阅[安装文档](docs/installation.md)。
2. [将 direnv hook 到你的 shell](docs/hook.md)。
现在重启你的 shell。
### 快速演示
在安装好 direnv 后,在你的 shell 中跟着操作。
```
# 为演示目的创建一个新文件夹。
$ mkdir ~/my-project
$ cd ~/my-project
# 显示 FOO 环境变量未加载。
$ echo ${FOO-nope}
nope
# 创建一个新的 .envrc。此文件是即将被
# direnv 加载的 bash 代码。
$ echo export FOO=foo > .envrc
.envrc is not allowed
# 安全机制不允许加载 .envrc。既然我们信任它,
# 让我们允许其执行。
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
# 显示 FOO 环境变量已加载。
$ echo ${FOO-nope}
foo
# 退出项目
$ cd ..
direnv: unloading
# 现在 FOO 再次被取消设置
$ echo ${FOO-nope}
nope
```
### 标准库
手动导出变量有点重复,所以 direnv 提供了一组实用函数,这些函数可在 `.envrc` 文件的上下文中使用。
举个例子,`PATH_add` 函数用于扩展路径并将其前置到 $PATH 环境变量。不用写 `export PATH=$PWD/bin:$PATH`,你可以写 `PATH_add bin`。这样更短,并且避免了 `$PATH=bin` 这样的常见错误。
要查找所有可用函数的文档,请查看 [direnv-stdlib(1) man page](man/direnv-stdlib.1.md)。
也可以通过在 `~/.config/direnv/direnvrc` 或 `~/.config/direnv/lib/*.sh` 创建 bash 文件来创建你自己的扩展。这个文件会在你的 `.envrc` 之前加载,因此允许你对 direnv 进行自己的扩展。
请注意,此功能在 `.env` 文件中不受支持。如果需要两者共存,可以使用 `.envrc` 来利用 stdlib,并在其末尾追加 `dotenv` 以指示 direnv 同时读取旁边的 `.env` 文件。
## 文档
* [安装 direnv](docs/installation.md)
* [Hook 到你的 shell](docs/hook.md)
* [为 direnv 开发](docs/development.md)
* [使用 direnv 和 ruby-install 管理你的 ruby](docs/ruby.md)
* [在 GitHub Actions 中使用 direnv](docs/github-actions.md)
* [社区 Wiki](https://github.com/direnv/direnv/wiki)
请务必看看 wiki!它包含各种有用的信息,如常用配方、编辑器集成和技巧。
### Man 手册
* [direnv(1) man page](man/direnv.1.md)
* [direnv-fetchurl(1) man page](man/direnv-fetchurl.1.md)
* [direnv-stdlib(1) man page](man/direnv-stdlib.1.md)
* [direnv.toml(1) man page](man/direnv.toml.1.md)
### 常见问题解答
基于 GitHub issues 的互动,以下是让用户感到困惑的主要问题:
1. direnv 有一个函数标准库,这是我多年来积累并觉得有用的一组实用工具。你可以在这里找到它:https://github.com/direnv/direnv/blob/master/stdlib.sh
2. 可以通过将 bash 文件添加到 `~/.config/direnv/direnvrc` 来用你自己的函数集覆盖 stdlib。此文件会被加载,其内容可供任何 `.envrc` 文件使用。
3. direnv 不会将 `.envrc` 加载到当前 shell 中。它会创建一个新的 bash 子进程来加载 stdlib、direnvrc 和 `.envrc`,并且只将环境差异导出回原始 shell。这允许 direnv 准确记录环境更改,并且也能与各种 shell 一起工作。这也意味着别名和函数目前无法导出。
### 测试
要运行我们的测试,请使用以下命令:(你可能需要安装 [homebrew](https://brew.sh/))
```
brew bundle
make test
```
## 互补项目
如果你正在使用 direnv,这里有一份你可能想了解的项目列表。
* [starship](https://starship.rs/) - 一个跨 shell 的提示符。
* [Projects for Nix integration](https://github.com/direnv/direnv/wiki/Nix) - 从各种提供优于 Direnv 内置 `use_nix` 实现改进的项目中选择。
## 相关项目
这里是同一设计领域中发现的其他项目列表。欢迎提交新项目。
* [Environment Modules](http://modules.sourceforge.net/) - 最古老的(褒义)环境加载系统之一
* [autoenv](https://github.com/hyperupcall/autoenv) - 较老、流行且轻量级。
* [zsh-autoenv](https://github.com/Tarrasch/zsh-autoenv) - autoenv 和 [smartcd](https://github.com/cxreg/smartcd) 的功能丰富混合体:进入/离开事件、嵌套、暂存(仅限 Zsh)。
* [asdf](https://github.com/asdf-vm/asdf) - 一个拥有插件系统的纯 bash 解决方案。[asdf-direnv](https://github.com/asdf-community/asdf-direnv) 插件允许配合 direnv 使用 asdf 管理的工具。
* [ondir](https://github.com/alecthomas/ondir) - OnDir 是一个小程序,用于自动化特定目录的任务
* [shadowenv](https://shopify.github.io/shadowenv/) - 使用 s-expression 格式来定义应该执行的环境更改
* [quickenv](https://github.com/untitaker/quickenv) - `.envrc` 文件的替代加载器,它不 hook 到你的 shell,且优先考虑速度而非便利性。
* [mise](https://github.com/jdx/mise) - direnv、make 和 asdf 三合一工具。
## 商业支持
寻求帮助或定制?
联系 Numtide 获取报价。我们让公司轻松使用开源项目:
## 版权
[MIT licence](LICENSE) - Copyright (C) 2019 @zimbatm 和 [贡献者](https://github.com/direnv/direnv/graphs/contributors)
标签:12factor, bash, Cutter, DevOps 工具, DNS 反向解析, dotfiles, EVTX分析, fish, Secrets 加载, Shell 扩展, TUI, zsh, 多语言支持, 子域名变形, 安全测试框架, 应用安全, 开发环境, 开发者生产力, 日志审计, 环境变量管理, 目录切换钩子, 网络调试, 自动化, 隔离环境