有没有一种好的方法来设置目录/项目本地环境变量?

有没有一种好的方法来设置目录/项目本地环境变量?

我一直在从事几个项目,它们需要不同的环境变量(例如,PATH对于不同版本的clang可执行文件,PYTHONPATH对于几个外部模块)。每当我从事一个项目时,我都必须自己修改这些环境变量(例如,更改.zshrc/.bashrcsourceit);我有时会忘记并犯错误。

有没有一种方法/项目可以帮助自动执行此操作,类似于虚拟环境在 Python 中呢?

答案1

有成熟的工具旨在为特定目录设置环境变量。

与为此设计的其他工具相比,direnv是其中最好的。主要好处之一是它支持卸下当您退出该目录时,更改环境变量。

direnv是 shell 的环境切换器。它知道如何挂钩 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录。这允许项目特定环境变量而不会使~/.profile文件混乱。

direnv与其他类似工具的区别是什么:

  • direnv是用 Go 编写的,快点与用 Python 编写的对应版本相比
  • direnv支持卸下当您从特定目录退出时使用环境变量
  • direnv覆盖许多贝壳

类似项目

  • 环境模块- 最古老(以一种好的方式)的环境加载系统之一
  • 自动环境- 轻的;不支持卸载;用Python写的很慢
  • zsh-autoenv- autoenv 和的功能丰富的混合物智能CD:进入/离开事件、嵌套、隐藏(仅限 Zsh)。
  • ~~阿斯达夫~~,asdf是一个插件管理器,用于切换同一可执行文件的不同版本。根本不是环境切换器。

答案2

add-zsh-hook对于 zsh,通过调用事件很容易做到这一点chpwd

env_on_chdir () {
    case $PWD in
        /home/user/path/to/dir )
            export GO111MODULE=on;
            ;;
        /home/user/other/dir )
            export NO_COLOR=true;
            ;;
        * )
            # change background, when entering any other directory
            export GO111MODULE=off;
            unset NO_COLOR;
            ;;
    esac
}

# add env_on_chdir to chpwd_functions
add-zsh-hook chpwd env_on_chdir

有关更多信息,请参阅https://www.refining-linux.org/archives/42-ZSH-Gem-8-Hook-function-chpwd.html

答案3

是的,太多的维护和太多的个人物品。
我建议将大部分精力投入到具有适合平台的适当范围的名称上,这样您就可以一直拥有所有这些名称。 PYTHONPATH 是一个很好的例子...您不太可能希望将其重新用于 Ruby 项目...您可以使用注释对组进行分组和标记以.bashrc方便维护。
并不总是可以做到这一点,即。当存在冲突时(加上它需要编辑而不是使用离散文件),有时您需要一个特定于框架的安装文件。一种方法是设置别名来运行它们,例如

例如

alias pp='. ~/pp.setup' # For using Python
alias rb='. /rb.setup'  # For using Ruby

您还可以创建一个函数,类似于“切换器”,它使用/设置一个变量,并仅使用传入的参数进行切换,或者仅切换到非当前内容。

答案4

您可以使用迪伦夫在目录更改时加载环境变量。从其主页:

direnv 是 shell 的环境切换器。它知道如何挂钩 bash、zsh、tcsh、fish shell 和 elvish 以根据当前目录加载或卸载环境变量。这允许使用特定于项目的环境变量,而不会弄乱 ~/.profile 文件。

我将它与 shell 一起使用xonsh(通过一个小的附加插件),效果非常好。

相关内容