【发布时间】: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-shell: how to specify a custom environment variable?
有了这个推导:
stdenv.mkDerivation rec {
FOO = "bar";
}
FOO 将在 nix shell 中作为环境变量提供,但是否可以从 env 文件加载环境变量?
【问题讨论】:
您可以使用nix-shell 的shellHook 通过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 结合使用
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 似乎不可行。