【问题标题】:nix-shell: how to load environment variables from env file?nix-shell:如何从 env 文件加载环境变量?
【发布时间】:2020-05-04 19:46:19
【问题描述】:

与本题相关:nix-shell: how to specify a custom environment variable?

有了这个推导:

stdenv.mkDerivation rec {
  FOO = "bar";
}

FOO 将在 nix shell 中作为环境变量提供,但是否可以从 env 文件加载环境变量?

【问题讨论】:

    标签: nix nixpkgs


    【解决方案1】:

    您可以使用nix-shellshellHook 通过sourcing 将环境变量从文件加载为shell 代码。例如:

    stdenv.mkDerivation {
      name = "my-shell";
      shellHook = ''
        # Mark variables which are modified or created for export.
        set -a
        source env.sh
        # or to make it relative to the directory of this shell.nix file
        # source ${toString ./env.sh}
        set +a
      '';
    }
    

    如果你的 shell 不是一个包,你可以从 stdenv.mkDerivation 切换到 mkShell

    【讨论】:

    • 几乎,在我的情况下应该是set -a; source .env; set+a,因为在 .env 文件中您没有明确导出变量。另一个问题是它不能与 direnv 结合使用
    • 谢谢!我已将其添加到我的答案中。但是 direnv 有什么问题呢?如果要加载其文件,可以将 env.sh 更改为 .envrc。 direnv 是问题的一部分吗?
    • direnv 不是问题的一部分,我应该为此创建另一个问题,但我很困惑,因为direnv 没有加载变量。不知道是什么问题,但是在使用nix-shell 时它可以工作,使用direnv + lorri 我得到这个错误(运行lorri shell):/nix/store/...-stdenv-linux/setup: line 83: /home/myuser/direnv-test/env.sh: No such file or directory。我解决了它用source ${./env.sh}替换source ${toString ./env.sh}
    • lorri 在 Nix 沙箱中运行 shellHook,所以这是有道理的。 ${./env.sh} 将 env 文件放在 Nix 存储中,以便它可用。 ${toString ./env.sh} 使用该文件,以便 $0${BASH_SOURCE[0]}nix-shell 中正常工作。 lorri 似乎不可行。
    猜你喜欢
    • 2017-09-02
    • 2021-08-19
    • 1970-01-01
    • 2020-01-11
    • 2015-02-27
    • 2015-09-16
    • 2021-10-14
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多