如何使用 nix 在堆栈中传递自定义环境变量(如密码)?

How to pass customize environment variable (like password) in stack with nix?

我在 nix 中使用堆栈。我需要将环境变量作为数据库密码传递,以便在运行时连接到 Postgres。目前,我在 YAML 中启用了 nix 并自定义了我自己的 .nix 以将密码放入 .nix.

stack.yaml:

nix:
  enable: true
  pure: true
  shell-file: shell.nix

shell.nix:

{ghc}:
with (import <nixpkgs> {});

haskell.lib.buildStackProject {
  inherit ghc;
  name = "myenv";
  buildInputs = [ postgresql_10 ];
  PGPASSWORD = "pw";
}

但是当我想将代码提交到 GitHub/Gitlab 并转到 CI/CD 管道时,在 .nix 中显式输入密码似乎不太好。请问有什么好的方法可以解决这个问题吗?

您可以在 Nix 表达式中使用 builtins.getEnv 函数从外部环境获取环境变量的值,因此您可以这样做:

PGPASSWORD = builtins.getEnv "PGPASSWORD";

这只是设置其值的一种方式。您还可以使用 import 导入您从未提交给 git 的 Nix 表达式文件,或者您可以使用 builtins.readFile 读取您从未提交给 git 的文件。