direnv/direnv

GitHub: direnv/direnv

基于目录自动加载和卸载环境变量的 shell 扩展工具,让开发环境配置实现项目级隔离。

Stars: 14816 | Forks: 764

# direnv -- 让你的 .profile 不再杂乱 [![Built with Nix](https://builtwithnix.org/badge.svg)](https://builtwithnix.org) [![Packaging status](https://repology.org/badge/tiny-repos/direnv.svg)](https://repology.org/project/direnv/versions) [![latest packaged version(s)](https://repology.org/badge/latest-versions/direnv.svg)](https://repology.org/project/direnv/versions) [![Support room on Matrix](https://img.shields.io/matrix/direnv:numtide.com.svg?label=%23direnv%3Anumtide.com&logo=matrix&server_fqdn=matrix.numtide.com)](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, 多语言支持, 子域名变形, 安全测试框架, 应用安全, 开发环境, 开发者生产力, 日志审计, 环境变量管理, 目录切换钩子, 网络调试, 自动化, 隔离环境