mcpField
D
direnv

direnv

官方
github.com开发者工具15.5kdirenv2 周前更新
代码仓库访问官网

关于 direnv

direnv 根据当前工作目录自动管理环境变量,进入项目目录时加载设置,离开时卸载。通过 .envrc 文件配置,无需修改 shell 配置,适合隔离不同项目的环境。

主要功能

  1. 01进入目录时自动加载 .envrc 中定义的环境变量
  2. 02离开目录时自动卸载环境变量,保持 shell 清洁
  3. 03支持多种 shell 集成(bash、zsh、fish 等)
  4. 04通过 direnv allow 安全地授权执行脚本

适用场景

  1. 01为不同项目隔离环境变量,避免冲突
  2. 02管理项目特定的 API 密钥和配置
  3. 03自动切换不同版本的开发工具和依赖

安装

选择你的系统或包管理器,复制命令到终端运行。

$
brew install direnv

安装完成后运行direnv --version确认安装成功。

命令示例

常用命令按使用顺序排列。

01
direnv hook zsh
02
direnv allow

详细介绍

direnv——让你的 .profile 更简洁

Built with Nix Packaging status latest packaged version(s) Support room on Matrix

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)
基本安装
  1. 大多数发行版都已打包 direnv。详情请参阅安装文档。
  2. 将 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 文件。

文档

记得看看 Wiki!其中包含各种实用信息,例如常见用法示例、编辑器集成以及技巧。

手册页
常见问题

根据 GitHub issue 讨论,以下是用户最容易感到困惑的问题:

  1. direnv 有一个标准库,其中包含一系列多年来我发现有用并积累下来的实用函数。你可以在这里找到它:https://github.com/direnv/direnv/blob/master/stdlib.sh

  2. 只需将一个 bash 文件添加到 ~/.config/direnv/direnvrc,即可用自己的一组函数覆盖标准库。此文件会被加载,其内容可供任何 .envrc 文件使用。

  3. 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,下面列出了一些值得了解的项目。

  • starship - 跨 shell 的提示符。
  • Nix 集成项目 - 可从多个项目中进行选择,这些项目都对 Direnv 内置的 use_nix 实现进行了改进。

相关项目

以下是一些设计理念相近的其他项目,欢迎提交新的项目。

  • 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

版权

MIT 许可证 - 版权所有 (C) 2019 @zimbatm 和贡献者

评论

支持 Markdown